我一直在尝试确定使用WiX注册COM服务器以创建Windows Installer程序包的最佳案例解决方案,并且我正在努力。
在这篇文章Deployment Engineering Archive: HOWTO: Use Regsvr32.exe with WIX中,有一个打开请求“安装警察”通过exe自定义操作来打击使用regsvr32。我知道使用regsvr32
注册到系统而不是用户的罪恶,但我还记得OleSelfRegister
可能有微软支持公告的问题(抱歉,找不到链接) - 我相信他们建议使用regsvr32
。
有什么建议吗?
答案 0 :(得分:4)
在以下位置阅读“不要使用SelfReg和TypeLib表”。
https://msdn.microsoft.com/en-us/library/bb204770#no_selfreg
对于WiX,请查看架构参考中的 Component 元素:
http://wixtoolset.org/documentation/manual/v3/xsd/wix/component.html
注意某些子元素,例如 AppId , Class , ProgId , Registry 等。正确的方法是使用COM extraction
来反映注册信息并以声明方式将其发送到安装程序中,以便MSI可以为您处理它,而无需处理某些代码(如DllRegisterServer()
)失败,也没有从维修和广告角度提供MSI对组件足迹的洞察力。
答案 1 :(得分:3)
Wix附带了一个“Tallow”工具。您可以使用它自动生成正确的注册表项。然后,您只需配置您的wix安装来编写这些条目。不应使用Selfreg。
答案 2 :(得分:1)
正如@Trampster指出的那样,heat.exe在从COM服务器中收集注册表项方面做得不好。我试过但结果不完整。
相反,按照Monitor Registry Accesses (InstallSite Tools: Monitoring)的建议,我使用了InstallShield RegSpyUI。据推测,这版本包含Installshield v7及更高版本,包括评估版本。此信息可能已过期;我可以确认它是不提供VS2013附带的非常无用的Installshield LE。
幸运的是,我确实拥有了InstallShield 2010的副本,这确实与RegSpyUI一起提供。
无论如何,使用RegSpyUI是一件轻而易举的事:将它指向COM .exe,将注册表信息解压缩到.reg文件。然后使用heat将其收集到您可以添加到Wix项目的.wxs文件中
heat reg <some.reg> -gg -o <some.wxs>
然后,只需修改指向COM .exe位置的任何硬编码路径,以便它们反映预期的安装文件夹。
e.g。如果RegSpyUI + heat创建的.wxs文件有这样的东西
<Fragment>
<DirectoryRef Id="TARGETDIR">
<Component Id="blah" Guid="{xxxxxxxxxxxxxxxxxxxxxxxxx}" KeyPath="yes">
<RegistryKey Key="TypeLib\{xxxxxxxxxxxxxxxxxxxxxx}\4.1\0\win32" Root="HKCR">
<RegistryValue Value="C:\Users\you\projects\MyProject\dependencies\installation\COMFOO.exe" Type="string" />
</RegistryKey>
</Component>
</DirectoryRef>
</Fragment>
您正在主wix文件中安装
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles">
<Directory Id="COMPANY" Name="My Company">
<!--This is the actual installation folder-->
<Directory Name="MyProduct" Id="MYPRODUCT">
然后只需将RegistryValue @ value路径编辑为...“[MYPRODUCT]\COMFOO.exe
”
答案 3 :(得分:0)
这仅有一个缺点:使用heat.exe注册WiX Com不适用于.exe COM服务器。 InstallShield及其工具似乎支持它,但是RegSpyUI只是一种UI工具,不是我可以在构建机器上运行的工具。
答案 4 :(得分:0)
尝试一下:
Interop.candidate.dll
(在obj\debug
文件夹中)