37

我找到了一个关于注册 DLL 的示例,使用 Windows Installer XML 工具集在 MSI 文件中注册 COM 互操作程序集。,并且 WiX 抱怨“AssemblyRegisterComInterop”属性。

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

4

3 回答 3

43

最简单的方法(Rob M 会大骂这是错误的)就是 SelfRegCost=1在 DLL 的 File 标记上使用。

这是错误的,因为我们应该显式控制 DLL 的注册,而不是允许它通过 DllRegisterServer 运行任意代码。理论上,当调用 DllRegisterServer 时,DLL 除了将适当的条目放入注册表之外什么都不做。不幸的是,他们中的许多人做得更多,因此自我注册可能是让您的安装工作的唯一方法。

这也是错误的,因为这意味着 Windows 安装系统对这些注册表项一无所知,也不知道应该存在什么和不应该存在什么。这意味着修复将不起作用,并且可能无法正确清理卸载等。

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

我希望这会有所帮助。

于 2008-12-12T21:31:35.560 回答
26

不只是我会咆哮和狂欢 SelfReg 是多么邪恶。MSI SDK列出了不使用 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>

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

于 2008-12-13T00:18:44.693 回答
13

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

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

如:

 heat.exe file my.dll -out my.wxs
于 2009-02-27T23:36:04.137 回答