首页 文章

在Wix安装期间注册.NET COM DLL

提问于
浏览
10

Background:

我们的应用程序是一个用于更大应用程序的插件 . 我们创建的所有内容都是较大的应用程序挂钩的DLL文件 . 因此我们的.NET(C#)必须为COM接口注册DLL文件 .

我们有一个工作InstallShield项目,但由于很多原因我不打算在这里,我们希望将其迁移到WiX . 对安装程序唯一要做的就是为COM注册我们的DLL文件 .

Problems

这是一个包含单个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>

根据How do you register a Win32 COM DLL file in WiX 3?的接受答案,建议将 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>

作为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>

我试图为COM注册.NET的每一种方式都失败了,在阅读了很多关于这个主题的问题之后,我就不知道正确的方法了 . 我该怎么办?当WiX中的其他所有内容相当简单时,为什么这是一项如此艰巨的任务?

我应该提一下,原来的InstallShield项目创建了一个自定义动作,可以调用 regasm.exe . 如果一切都失败了,那可能是一种可能性,但我宁愿做正确的事情 .

我刚刚发现 heat.exe file myDll.dll -scom -o myDll.wxs 输出类似于我需要的注册表值 . 现在,如何在DLL组件中引用新创建的组件?

1 回答

  • 9

    我刚发现heat.exe文件myDll.dll -scom -o myDll.wxs输出类似于我需要的注册表值 .

    你确定 -scom 吗? AFAIK,该选项实际上抑制了COM注册!

    现在如何在DLL组件中引用新创建的组件?

    heat.exe 生成的组件已包含DLL的 File 元素 . 所以它实际上包含安装和注册DLL文件所需的一切 . 您不需要原始的"DLL component" .

    如果需要将文件及其COM注册放在单独的组件中,则必须从heat.exe生成的组件中删除 File 元素 .

    此外,组件不能引用其他组件 . 你可以在ComponentGroup之间引用,我们在wixlibs中大量使用model dependencies,但这是一个相当高级的用例 .

相关问题