背景:
我们的应用程序是一个更大应用程序的插件。我们创建的所有内容都是该较大应用程序钩取的DLL文件。因此,我们的.NET(C#)DLL文件必须为COM接口注册。
我们有一个可行的InstallShield项目,但由于许多原因,我不会在这里详细说明,我们希望将其迁移到WiX。安装程序仅剩下的任务是为COM注册我们的DLL文件。
问题
这是一个带有单个DLL文件的示例组件。
<Component Id="MyComponent" Guid="COMPONENT-GUID" SharedDllRefCount="yes" >
<File Id="MyDLL.dll" Name="MyDLL.dll" KeyPath="yes" Assembly=".net"
AssemblyManifest="MyDLL.dll" AssemblyApplication="MyDLL.dll" />
</Component>
根据如何在WiX 3中注册Win32 COM DLL文件?的被接受答案,建议在File标签中添加
SelfRegCost=1
。这将导致安装过程中出现错误:
同一问题的第二个回答(Rob Menshing)建议不要采用此方法,而是在文件标签内添加以下内容:模块C:\Program files\Product\MyDll.dll未能注册。HRESULT -2147024769。请联系您的支持人员。
<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>
我有些困惑于放置CLSID ids。我放了一个生成的GUID并进行了安装。安装很顺利,但更大的应用程序找不到DLL文件。(我使用从heat.exe
生成的接口标签。)
同一问题中(由Adan Tegen提出)的另一种方法建议使用 heat.exe file myDll.dll -out my.wxs。
使用输出,我将其添加到File标记中:
<TypeLib Id="Another Guid" Language="0" MagorVersion="1">
<!--Interfaces generated from heat.exe-->
</TypeLib>
每一种我尝试将.NET注册为COM的方法都失败了,读了这么多关于此话题的问题后,我离知道正确的做法更远了。我该怎么办?为什么这是一个如此困难的任务,当WiX中的其他所有事情都相对简单时?
我应该提到原始InstallShield项目创建了一个自定义操作,该操作将调用
regasm.exe
。如果其他所有方法都失败了,那可能是一种选择,但我宁愿正确地完成。我刚刚发现
heat.exe file myDll.dll -scom -o myDll.wxs
输出类似于我需要的注册表值。现在,我如何引用新创建的组件内的DLL组件?