我一直在尝试确定使用WiX注册COM服务器以创建Windows Installer程序包的最佳案例解决方案,并且我正在努力。

在这篇文章中部署工程档案:HOWTO:使用Regsvr32.exe和WIX ,有一个打开请求<!>“安装警察<!>”;通过exe自定义操作来打击使用regsvr32。我知道使用regsvr32的错误,因为它注册到系统而不是用户,但我还记得OleSelfRegister可能有微软支持公告的问题(对不起,找不到链接) - 我相信他们建议使用<=>。

有什么建议吗?

有帮助吗?

解决方案

读取<!>“;不要使用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对组件占地面积的深入了解。

其他提示

有一个工具<!>“Tallow <!>”;包含在Wix中。您可以使用它自动生成正确的注册表项。然后,您只需配置您的wix安装来编写这些条目。不应使用Selfreg。

正如@Trampster指出的那样,heat.exe在从COM服务器中收集注册表项方面做得不好。我试过但结果不完整。

相反,请遵循 Monitor Registry Accesses(InstallSite工具:监控) ,我使用了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 <!>”;

这只有一个缺点:使用heat.exe注册WiX Com对.exe COM服务器不起作用。 InstallShield及其工具似乎支持它,但RegSpyUI只是一个UI工具,而不是我可以在我的构建机器上运行的工具。

试试这个:

  1. 创建新的.NET项目
  2. 将项目引用添加到要收集其wx的候选COM dll或OOP exe
  3. 搜索文件Interop.candidate.dll(在obj\debug文件夹中)
  4. 在您刚找到的互操作dll上运行WiX Heat工具。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top