ICE03:字符串溢出(大于列中允许的长度);表:CustomAction

时间:2013-05-09 11:07:46

标签: wix wix3.7

我收到以下代码的ICE03:字符串溢出警告:

<CustomAction Id="CustomActionID"
          Return="check"
          Property="SomeProperty"
          Value="VERY LONG STRING COMES HERE"
          Execute="immediate"/>

此代码包含在片段中的单独.wxs文件中。如果我将其直接包含在“Product”标签中,则警告消失。使用以下代码也会发生这种情况:

<Binary Id="SomeBinaryWithAVeryLongName" SourceFile="SOURCEFILE" />

我想知道为什么会发生这种情况?

1 个答案:

答案 0 :(得分:8)

CustomAction/@Value属性在Windows Installer中的限制为255个字符。因此,如果您的"VERY LONG STRING COMES HERE"字符数超过255个,则会发出ICE警告。 Binary/@Id甚至更短,因为它们是MSI中的“标识符”,Windows安装程序标准化为72个字符的标识符。

由于ICE验证是针对最终的MSI执行的,因此当放置在Product元素下时ICE03warning消息为何会有所不同是一个谜。最终的MSI并不关心你如何组织你的.wxs源代码来构建MSI。根据代码是在Product还是在Fragment下?你有可能看到其他警告(不是ICE03)吗?

我询问ProductFragment之间区别的原因是因为编译器在编译Product部分与Fragment部分时知道不同的事情。编译器知道Product部分将创建.MSI文件。另一方面,Fragment可以创建.MSI文件,.MSM文件或.MSP文件。除.MSI文件外,.MSM和.MSP文件还有其他限制。

例如,在构建.MSM文件时,所有标识符都以Module/@Id为后缀。这会为已经限制为72个字符的标识符添加额外的37个字符。 Binary/@Id进一步受限,因为它最终成为.MSM文件中流的名称,因此无法查看大约60个字符的内容。

无论如何,最终结果是当在Fragment中时,编译器将所有可能的规则应用于标识符。在所有情况下,规则可能比绝对必要的限制更多。但是,如果你注意到所有的警告/错误,那么你的代码应该在所有情况下编译。