背景:
我们的应用程序是一个用于更大应用程序的插件.我们创建的所有内容都是较大的应用程序挂钩的DLL文件.因此我们的.NET(C#)必须为COM接口注册DLL文件.
我们有一个有效的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>
Run Code Online (Sandbox Code Playgroud)
根据接受的答案如何在WiX 3中注册Win32 COM DLL文件?,建议添加SelfRegCost=1到File标签.这会导致安装期间出错:
模块C:\ Program files\Product\MyDll.dll无法注册.HRESULT -2147024769.联系您的支持人员.
同一问题中的第二个答案(由Rob Menshing提出)建议不要采用这种方法,但要在文件标签内添加:
<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>
Run Code Online (Sandbox Code Playgroud)
作为CLSID ID,我有点困惑.我输入了生成的GUID并安装了它.它安装得很好,但较大的应用程序找不到DLL文件.(我使用了生成的接口标签heat.exe.)
在同一个问题中找到的另一种方法(由Adan Tegen提出)建议使用heat.exe文件myDll.dll -out my.wxs
使用输出,我将其添加到File标记:
<TypeLib Id="Another Guid" Language="0" MagorVersion="1">
<!--Interfaces generated from heat.exe-->
</TypeLib>
Run Code Online (Sandbox Code Playgroud)
我试图为COM注册.NET的每一种方式都失败了,在阅读了很多关于这个主题的问题之后,我就不知道正确的方法了.我该怎么办?当WiX中的其他所有内容相当简单时,为什么这是一项如此艰巨的任务?
我应该提一下,原始的InstallShield项目创建了一个可以调用的自定义操作regasm.exe.如果一切都失败了,那可能是一种可能性,但我宁愿做正确的事情.
我刚刚发现heat.exe file myDll.dll -scom -o myDll.wxs输出注册表值与我需要的类似.现在,如何在DLL组件中引用新创建的组件?
Wim*_*nen 10
我刚刚发现
heat.exe file myDll.dll -scom -o myDll.wxs输出注册表值与我需要的类似.
你确定-scom吗?AFAIK,该选项实际上抑制了COM注册!
现在我如何在DLL组件中引用新创建的组件?
生成的组件heat.exe已包含FileDLL 的元素.所以它实际上包含安装和注册DLL文件所需的一切.您不需要原始的"DLL组件".
如果您需要将文件及其COM注册放在单独的组件中,则必须File从heat.exe生成的组件中删除该元素.
此外,组件不能引用其他组件.你可以在ComponentGroup之间引用一些引用,我们在wixlibs中大量使用它来建模依赖项,但这是一个相当高级的用例.
| 归档时间: |
|
| 查看次数: |
9961 次 |
| 最近记录: |