我找到了一个关于注册DLL的示例, Registering an Assembly for COM Interop in a MSI file with the Windows Installer XML toolset. ,并且WiX抱怨“AssemblyRegisterComInterop”属性。
我删除了它并将“Assembly”属性更改为win32,它说我需要指定AssemblyManifest属性,但是我应该把它放在那里?
答案 0 :(得分:41)
最简单的方法(而且Rob M会对这是错误如何咆哮和狂热)只是在DLL的File标签上使用SelfRegCost=1
。
这是错误的,因为我们应该明确控制DLL的注册,不允许它只是通过DllRegisterServer运行任意代码。理论上,当调用DllRegisterServer时,DLL不应该在注册表中放入适当的条目。不幸的是,他们中的很多人做得更多,所以自我注册可能是让你的安装工作的唯一方法。
这也是错误的,因为这意味着Windows安装系统对这些注册表项一无所知,应该和不应该有什么。这意味着修复将无法正常工作,并且可能无法正常安装,等等。
否则,您可以通过将heat.exe
指向DLL并将其输出集成到当前的WiX项目中来生成相应的WiX代码。您将获得各种Class,ProgID,TypeLib和Registry标记。您可能需要手动编辑该输出以使其进行编译。
我希望有所帮助。
答案 1 :(得分:24)
不仅仅是我会对SelfReg是如何邪恶而咆哮和赞美。 MSI SDK为您提供了a list of seven reasons why not to use 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>
最终,特洛伊的答案都是正确的。
答案 2 :(得分:13)
您可以尝试使用heat.exe程序,然后在您的wix代码中引用该片段。
heat.exe file <filename> -out <output wxs file>
如:
heat.exe file my.dll -out my.wxs