我收到以下代码的 ICE03:字符串溢出警告:
<CustomAction Id="CustomActionID"
Return="check"
Property="SomeProperty"
Value="VERY LONG STRING COMES HERE"
Execute="immediate"/>
此代码包含在片段中的单独 .wxs 文件中。如果我将其直接包含在“产品”标签中,则警告就会消失。以下代码也会发生这种情况:
<Binary Id="SomeBinaryWithAVeryLongName" SourceFile="SOURCEFILE" />
我想了解一下为什么会出现这种情况?
The CustomAction/@Value
Windows Installer 中属性的长度限制为 255 个字符。所以,如果你的"VERY LONG STRING COMES HERE"
如果字符数超过 255 个,您将收到 ICE 警告。Binary/@Id
甚至更短,因为它们是 MSI 中的“标识符”,并且 Windows Installer 针对这些标识符标准化了 72 个字符。
为什么 ICE03 警告消息在放置在Product
元素,因为 ICE 验证是针对最终 MSI 执行的。最终的 MSI 并不关心您如何组织 .wxs 源代码来构建 MSI。您是否有可能看到其他警告(不是 ICE03),具体取决于代码是否在Product
或在一个Fragment
?
我询问两者之间差异的原因Product
or Fragment
是因为编译器在编译时知道不同的事情Product
部分与aFragment
部分。编译器知道Product
部分将创建一个 .MSI 文件。 AFragment
另一方面可以创建 .MSI 文件、.MSM 文件或 .MSP 文件。除了 .MSI 文件之外,.MSM 和 .MSP 文件还有其他限制。
例如,在构建 .MSM 文件时,所有标识符都带有后缀Module/@Id
。这为已经限制为 72 个字符的标识符增加了 37 个字符。这Binary/@Id
进一步受到限制,因为它最终成为 .MSM 文件中流的名称,因此不能超过 60 个字符左右。
无论如何,最终的结果是,当处于Fragment
编译器将所有可能的规则应用于标识符。在所有情况下,这些规则可能比绝对必要的限制稍微严格一些。但是,如果您注意到所有警告/错误,那么您的代码应该在所有情况下都能编译。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)