在Wix安装过程中注册一个.NET COM DLL

12

背景:

我们的应用程序是一个更大应用程序的插件。我们创建的所有内容都是该较大应用程序钩取的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。这将导致安装过程中出现错误:

模块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>

我有些困惑于放置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组件?
1个回答

10
我发现heat.exe文件 myDll.dll -scom -o myDll.wxs输出的注册表值与我所需的类似。您确定那里的-scom吗?据我所知,该选项实际上会抑制COM注册!由heat.exe生成的组件已经包括DLL的File元素。因此,它实际上包含安装和注册DLL文件所需的所有内容。您不需要原始的" DLL 组件"。
如果您需要将文件及其COM注册放在单独的组件中,则必须从由heat.exe生成的组件中删除File元素。另外,组件不能引用其他组件。但可以在ComponentGroup之间建立引用,这是我们在wixlibs中大量使用以model dependencies,但这是一个相当高级的用例。

那么在我的<Feature>中,我只需添加<ComponentRef Id="ComponentInFragment" />?我的heat.exe命令应该是什么?-scom是我在谷歌搜索时找到的建议。我觉得禁止COM很奇怪,但它给了我期望的CSLID。 heat.exe file myDll.dll -o mydll.wxs? - SaulBack
我使用了“heat.exe file myDll.dll -o mydll.wxs”的输出结果。谢谢。 - SaulBack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接