在询问Visual Studio注册COM库后做了什么,很明显VS为COM注册做了两件事:
注册了COM库
创建并注册类型库
Visual Studio似乎使用regasm.exe进行此注册.对于第一部分(直接COM注册)使用tallow
或heat
(WiX 2.0或WiX 3.0)似乎可以获得所有基本的COM注册信息.
但是,动物/热似乎没有设置类型库安装.可以使用WiX安装程序和regasm.exe创建自定义操作来执行此操作,但是当涉及基于Microsoft安装程序的安装程序时,调用自定义操作不是最佳做法.
经过进一步研究,看起来msi能够在安装时生成类型库.事实上,WiX似乎直接支持它!在文件元素中,您可以添加Typelib元素.实际上,wix上的这篇文章有一个用Interface元素填充TypeLib元素的例子.
似乎Interface元素至少有两个必需的属性:
ID
名称
Larry Osterman谈到了通常需要为TypeLib注册的接口的其他部分,这个接口条目似乎照顾了各个部分.Larry说我们需要将ProxyStubClassId32指定为"{00020424-0000-0000-C000-000000000046}",因此我们可以轻松添加它.
从那里去哪里以及为各种界面元素填写的内容让我感到难过.我已经继续将TypeLib元素添加到我的wix文件中,并且它已成功编译.关于如何设置Interface元素,我有点无能为力.我们需要做些什么来正确填写TypeLib元素,以及我可以使用哪些应用程序或工具来获取它?
wcoenen下面的答案看起来很有希望......我打算试一试.
更新:在下面发布我的最终解决方案作为答案.
这是懒人解决这个问题的方法:使用heat
WiX 3.0.
如果你有一个自动生成的类型库并通过regasm安装,heat
可以将.tlb作为参数
heat file c:\my\path\to\my.tlb -out tlb.wxs
它将生成您需要注册的所有typelib和interface元素.这不能解决需要提前知道它们的问题,并且它不能解决当程序集版本发生变化时GUID更改的问题(即使接口没有 - 这是你唯一的时间'应该改变它但它会让你在那里中途.
以下技巧可以帮助您收集任何注册表更改并将其转换为wxs文件,包括您之后的typelib元素.
首先,将注册表恢复到未注册类型库的状态:
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm.exe /tlb /u mylib.dll
将注册表的这个干净状态导出到hklm-before.reg:
c:\WINDOWS\system32\reg.exe export HKLM hklm-before.reg
再次注册类型库:
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm.exe /tlb mylib.dll
将注册表的新状态导出到hklm-after.reg:
c:\WINDOWS\system32\reg.exe export HKLM hklm-after.reg
现在我们有两个文本文件,hklm-before.reg和hklm-after.reg.创建一个diff.reg文件,该文件仅保存这些文件之间的相关差异.您可以使用差异工具轻松找到差异.我喜欢使用TortoiseSVN中包含的diff工具,因为我每天都使用它.(由于文本编码问题,WinDiff在这种情况下似乎不能很好地工作.)
现在,我们可以通过调用转换diff.reg成.wxs heat.exe
与reg
命令.(需要wix 3.5或更新.)
heat reg diff.reg -out typelib.wxs