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