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

38
3个回答

44

最简单的方法(Rob M会大声抱怨这是错误的)就是在DLL文件标签上使用SelfRegCost=1

这是错误的,因为我们应该明确地控制DLL的注册,而不是允许其通过DllRegisterServer运行任意代码。理论上,当调用DllRegisterServer时,DLL除了将适当的条目放入注册表之外不应该做任何事情。不幸的是,许多DLL不仅仅如此,因此自注册可能是使您的安装程序工作的唯一方法。

这也是错误的,因为这意味着Windows安装系统不知道那些注册表键,以及哪些应该和不应该在那里。这意味着修复操作可能无法正常工作,卸载操作也可能无法正确清理等等。

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

希望这有所帮助。


我喜欢将heat创建的wxs放入主wxs引用的片段中。你传递给heat的选项是什么,没有注册dll呢? - CheGueVerra
4
通常我会以这种方式运行热编译:heat file -gg -sfrag "C:\path\to\file.dll" -o myfile.wxs ... 然后将生成的wxs文件包含在votive项目中,进行修改,并通过componentref或componentgroupref引用msi / merge模块的“main” wxs中的根组件。 - Troy Howard
对于我的构建过程,我已经使用定制脚本自动化了手动编辑。我建议你也这样做... ;) - Troy Howard
只是一个问题,如果这是不好的(我自己也向他人宣传过),那么为什么SelfRegCost=1的含义没有改变为“通过heat.exe提取内容,然后包含创建的片段”?本质上使其成为几乎是预处理步骤。 - 0xC0000022L
但是 heat 命令有时会出现错误,甚至无法为 COM 组件生成 wxs 文件。 - Ven
显示剩余4条评论

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>

最终,Troy的回答是完全正确的。


1
"自注册被视为有害"(请原谅Dijkstra的比喻)。 - Stein Åsmul

14
使用WiX工具集中附带的heat.exe程序,生成wxs注册片段:
 heat.exe file <filename> -out <output wxs file>

eg.

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

将新的wxs文件中<Component>标签的内容复制并粘贴到现有的wxs文件中,该文件使用<File>标签引用您的dll的<Component>中。删除您粘贴的<File>标签,并用已经存在的文件Id替换对该文件Id的所有引用;如果现有的文件没有Id属性,请添加它并设置为任何您想要的值。


2
添加如何使用Fragment的说明 - Theodosius Von Richthofen

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