【问题标题】:Autogen guid (*) in Windowsinstaller cause ICE08 errorWindowsinstaller 中的 Autogen guid (*) 导致 ICE08 错误
【发布时间】:2013-04-23 13:51:07
【问题描述】:

我的 wxs 文件中的两个组件标签如下

<Component Id="Comp.Comp1" Guid="*" >
<Condition><![CDATA[VersionNT < 602]]></Condition>
<File Id="File1" Source="$(Dir1)\TestFile.dll" />
 </Component>

<Component Id="Comp.Comp2" Guid="*" >
<Condition><![CDATA[VersionNT >= 602]]></Condition>
<File Id="File2" Source="$(Dir2)\TestFile.dll" />
 </Component>

但我收到如下错误

ICE08: Component: Comp.Comp2 has a duplicate GUID: {2963D8E7-CBEC-50C8-AF4B-65E895FE3283}   

即使我给了 autogen guid 值“*”,我是如何得到这个错误的

谢谢,

【问题讨论】:

    标签: windows build installation wix windows-installer


    【解决方案1】:

    Component 元素的 star-GUID 根据文件的目标位置计算出稳定的 GUID。 GUID 的稳定性对于未来的更新(尤其是补丁)至关重要。它在许多情况下都很好用,但是将文件放入完全相同的位置的互斥组件不是一个。在这种情况下,您需要显式设置至少一个Component/@Guids。

    在上述情况下,您可以执行以下操作:

    <Component Id="Comp.Comp1" Guid="*" >
        <Condition><![CDATA[VersionNT < 602]]></Condition>
    
        <File Id="File1" Source="$(Dir1)\TestFile.dll" />
    </Component>
    
    <Component Id="Comp.Comp2" Guid="PUT-GUID-HERE">
        <Condition><![CDATA[VersionNT >= 602]]></Condition>
    
        <File Id="File2" Source="$(Dir2)\TestFile.dll" />
    </Component>
    

    从技术上讲,您可以在这种情况下抑制 ICE08 错误,因为组件是互斥的,但我个人会在抑制 ICE 之前执行上述操作。恕我直言,最好是不同的文件最终有不同的 GUID。

    【讨论】:

    • 虽然说在 SFN 和 LFN 系统上安装了相同的文件,但您仍然会收到警告。
    • 非常正确,但 IIRC 那些警告明确指出,如果组件互斥也没关系。由于这些是互斥的,因此可以确认和忽略警告(尽管我希望我们有机制在代码中确认并禁止它,有一天会成为一个不错的功能)。
    • 我明白了。我的观点是在非常非常大的项目(Visual Studio 产品线复杂性)上工作,其中有太多的代码,以至于自动化知道什么可以忽略和什么不可以忽略是一个挑战。因此,我们采取了极端措施来减少警告。
    • 是的,我知道那种感觉。同样,WiX 工具集中的一个确认警告的功能会很棒。但是 ICE 需要做很多工作,所以我们会看看未来是否会发生一些事情。
    • 嗨 chris 和 Rob,我还有一个问题 上述情况是否适用于 64 位操作系统?如果不是那么我怎么能给出新的条件。谢谢,
    【解决方案2】:

    您没有显示此 sn-p(目录元素)的上下文,但对我来说,您似乎将相同的文件名安装到同一目录两次。这是违反组件规则的。 “来源”不同但条件相同:!VersionNT >= 602.

    【讨论】:

    • 哦,对不起,我已经改变了条件。我可以抑制 ICE08 错误
    • 我想我读过 Rob 说你可以,但我不会。原因是即使文件名相同,它们也不是兼容的组件。首先,我想问您是否可以重新设计您的软件以使用不同的文件名(一个示例是选择正确的 O/S 特定实现的工厂)。从安装程序的角度来看,我所做的是将这些文件安装为不同的文件名和/或目录(因此不同的 GUID),然后使用 CopyFile 元素将它们复制到正确的目录/文件名。
    • 尽管文件名相同,但文件不同。一个文件在 .net3.5 下,一个在 .net4 下。我不能为文件名提供不同的名称
    • 但是您可以将它们安装到子目录 [INSTALLDIR]A\TestFile.dll 和 [INSTALLDIR]B\TestFile.dll,然后使用 CopyFile 元素将 [INSTALLDIR]X\TestFile.dll 复制到 [INSTALLDIR] ]TestFile.dll。缺点是您将安装一次 DLL。一个重要,一个不重要。好处是您将能够轻松识别安装了哪个文件,并且您将通过 ICE 验证。
    • 这是一个很好的提示,克里斯,它有效。感谢您的宝贵时间
    猜你喜欢
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 2021-05-10
    • 2013-10-21
    相关资源
    最近更新 更多