0

我正在尝试使用 WixSharp 重新创建旧版安装程序的功能。在旧版安装项目中,一些第三方 DLL 被标记为“vsdrfCOMSelfReg”。 我在很多地方都看到过你可以添加到 File 标签中SelfRegCost="0",但它是非常不受欢迎的。

如何使用 WixSharp 正确注册 COM DLL?有没有办法从 WixSharp 将 SelfRegCost 字段添加到 DLL 的文件标签?

4

2 回答 2

2

确实,您可以在 File 元素中说 SelfRegCost=1 之类的内容,但正如您所发现的,每个安装人员都会告诉您这是邪恶的。非邪恶的方法是使用dll上的heat.exe将注册数据提取到wxs文件中。如有必要,通过在 tlb 文件上运行 heat.exe 添加类型库数据的接口条目。Heat 只是一个 WiX 工具,我不明白 WiXSharp 是如何参与其中的。

关键是注册数据是静态的,可以通过 WiX 存储在 MSI 中,并在安装时简单地写入系统,而无需加载和调用 Dll。

于 2014-08-25T19:54:36.120 回答
1

经过进一步的源代码浏览和实验,我想出了如何通过 WixSharp 强制执行邪恶的方法。我后来还发现,WixSharp 示例“CustomAttributes”在某种程度上涵盖了这一点。

《恶道》

File LibToReg = new File("..\Path\To\LibToReg.dll");
LibToReg.AttributesDefinition += "SelfRegCost=1";

或者(基于 CustomAttributes 示例):

File LibToReg = new File("..\Path\To\LibToReg.dll")
            {
                Attributes = new Attributes() { { "SelfRegCost", "1" } }
            };

这将在下面生成以下 wxs:

<Component Id="Component.LibToReg.dll" Guid="EABD7A49-26DD-4720-AE5A-AA9EEFD8C91A">
          <File Id="File.LibToReg.dll" Source="..\Path\To\LibToReg.dll" SelfRegCost="1" />
</Component>

生成的其余代码看起来与安装的任何其他 DLL 相同。

作为参考,这里是使用 Add-In Express 中的“VDProj to WiX Converter”从原始安装项目生成的原始 wxs 源。我相信 SelfRegCost="0" 是由转换器添加的,但后来可能是同事手动添加的。

<Component Id='com_FB7105EC_5352_4561_AE01_405562F0EA1E' Guid='6718170E-0335-4FD6-A1E8-D9E926DDE3EC' Permanent='no' SharedDllRefCount='no' Transitive='no'>
            <File Id='_FB7105EC_5352_4561_AE01_405562F0EA1E' DiskId='1' Hidden='no' ReadOnly='no' SelfRegCost='0' System='no' Vital='yes' Compressed='yes' Name='LibToReg.dll' Source='..\Path\To\LibToReg.dll' KeyPath='yes' />
</Component>
于 2014-08-26T15:02:43.450 回答