如何在WiX 3中注册Win32 COM DLL文件?

时间:2008-12-12 21:21:38

标签: com dll wix wix3

我找到了一个关于注册DLL的示例, Registering an Assembly for COM Interop in a MSI file with the Windows Installer XML toolset. ,并且WiX抱怨“AssemblyRegisterComInterop”属性。

我删除了它并将“Assembly”属性更改为win32,它说我需要指定AssemblyManifest属性,但是我应该把它放在那里?

3 个答案:

答案 0 :(得分:41)

最简单的方法(而且Rob M会对这是错误如何咆哮和狂热)只是在DLL的File标签上使用SelfRegCost=1

这是错误的,因为我们应该明确控制DLL的注册,不允许它只是通过DllRegisterServer运行任意代码。理论上,当调用DllRegisterServer时,DLL不应该在注册表中放入适当的条目。不幸的是,他们中的很多人做得更多,所以自我注册可能是让你的安装工作的唯一方法。

这也是错误的,因为这意味着Windows安装系统对这些注册表项一无所知,应该和不应该有什么。这意味着修复将无法正常工作,并且可能无法正常安装,等等。

否则,您可以通过将heat.exe指向DLL并将其输出集成到当前的WiX项目中来生成相应的WiX代码。您将获得各种Class,ProgID,TypeLib和Registry标记。您可能需要手动编辑该输出以使其进行编译。

我希望有所帮助。

答案 1 :(得分:24)

不仅仅是我会对SelfReg是如何邪恶而咆哮和赞美。 MSI SDK为您提供了a list of seven reasons why not to use 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>

最终,特洛伊的答案都是正确的。

答案 2 :(得分:13)

您可以尝试使用heat.exe程序,然后在您的wix代码中引用该片段。

 heat.exe file <filename> -out <output wxs file>

如:

 heat.exe file my.dll -out my.wxs