【问题标题】:vsdrfCOMSelfReg equivalent for WixSharp与 WixSharp 等效的 vsdrfCOMSelfReg
【发布时间】:2014-10-18 18:37:21
【问题描述】:

我正在尝试使用 WixSharp 重新创建旧版安装程序的功能。在旧版安装项目中,一些第三方 DLL 被标记为“vsdrfCOMSelfReg”。 I have seen in various places 可以添加到文件标签 SelfRegCost="0" 但它非常不受欢迎。

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

【问题讨论】:

    标签: wix windows-installer wixsharp


    【解决方案1】:

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

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

    【讨论】:

    • 我想知道我是否可以从 WixSharp 做所有事情,以便项目中的其他开发人员不必了解热量或底层 Wix 工具,只需要能够使用类似 C# 的 WixSharp 语法,可在设置中添加任何新内容。
    【解决方案2】:

    经过进一步的源代码浏览和实验,我想出了如何通过 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>
    

    【讨论】:

    • 我最终使用相同的属性方法将安装程序的某些部分标记为 64 位,以确保将注册表项应用于 64 位注册表。我能够使用稍微简单的语法,它可能可以与您使用的语法互换。它是:{ AttributesDefinition = "Component:Win64=yes" }, 所以这可能也适用于你的{ AttributesDefinition = "Component:SelfRegCost=1" } 不一定更好,只是不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    相关资源
    最近更新 更多