我找到了一个关于注册 DLL 的示例,使用 Windows Installer XML 工具集在 MSI 文件中注册 COM 互操作程序集。,并且 WiX 抱怨“AssemblyRegisterComInterop”属性。
我删除了它并将“Assembly”属性更改为 win32,它说我需要指定 AssemblyManifest 属性,但我应该放什么?
我找到了一个关于注册 DLL 的示例,使用 Windows Installer XML 工具集在 MSI 文件中注册 COM 互操作程序集。,并且 WiX 抱怨“AssemblyRegisterComInterop”属性。
我删除了它并将“Assembly”属性更改为 win32,它说我需要指定 AssemblyManifest 属性,但我应该放什么?
最简单的方法(Rob M 会大骂这是错误的)就是 SelfRegCost=1
在 DLL 的 File 标记上使用。
这是错误的,因为我们应该显式控制 DLL 的注册,而不是允许它通过 DllRegisterServer 运行任意代码。理论上,当调用 DllRegisterServer 时,DLL 除了将适当的条目放入注册表之外什么都不做。不幸的是,他们中的许多人做得更多,因此自我注册可能是让您的安装工作的唯一方法。
这也是错误的,因为这意味着 Windows 安装系统对这些注册表项一无所知,也不知道应该存在什么和不应该存在什么。这意味着修复将不起作用,并且可能无法正确清理卸载等。
否则,您可以通过指向heat.exe
您的 DLL 并将其输出集成到您当前的 WiX 项目中来生成适当的 WiX 代码。您将获得各种 Class、ProgID、TypeLib 和 Registry 标签。您可能需要手动编辑该输出以使其编译。
我希望这会有所帮助。
不只是我会咆哮和狂欢 SelfReg 是多么邪恶。MSI SDK列出了不使用 SelfReg 的七个理由。
例子:
<Component Id="Component" Guid="*">
<File Source="ComServer.dll">
<Class Id="PUT-CLSID-HERE" Context="InprocServer32" ThreadingModel="apartment" Description="Your server description">
<ProgId Id="Your.Server.1" Description="Your ProgId description">
<ProgId Id="Your.Server" Description="Your ProgId description" />
</ProgId>
</Class>
<Class Id="PUT-PROXY-CLSID-HERE" Context="InprocServer32" ThreadingModel="both" Description="Your server Proxies, assuming you have them">
<Interface Id="PUT-INTERFACEID-HERE" Name="IInterface1" />
<Interface Id="PUT-INTERFACEID-HERE" Name="IInterface2" />
<Interface Id="PUT-INTERFACEID-HERE" Name="IInterface3" />
<Interface Id="PUT-INTERFACEID-HERE" Name="IInterface4" />
</Class>
</File>
</Component>
最终,特洛伊的答案是正确的。
您可以尝试使用 heat.exe 程序,然后在您的 wix 代码中引用该片段。
heat.exe file <filename> -out <output wxs file>
如:
heat.exe file my.dll -out my.wxs