我收到以下代码的ICE03:字符串溢出警告:
<CustomAction Id="CustomActionID"
Return="check"
Property="SomeProperty"
Value="VERY LONG STRING COMES HERE"
Execute="immediate"/>
此代码包含在片段中的单独.wxs文件中。如果我将其直接包含在“Product”标签中,则警告消失。使用以下代码也会发生这种情况:
<Binary Id="SomeBinaryWithAVeryLongName" SourceFile="SOURCEFILE" />
我想知道为什么会发生这种情况?
答案 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)吗?
我询问Product
或Fragment
之间区别的原因是因为编译器在编译Product
部分与Fragment
部分时知道不同的事情。编译器知道Product
部分将创建.MSI文件。另一方面,Fragment
可以创建.MSI文件,.MSM文件或.MSP文件。除.MSI文件外,.MSM和.MSP文件还有其他限制。
例如,在构建.MSM文件时,所有标识符都以Module/@Id
为后缀。这会为已经限制为72个字符的标识符添加额外的37个字符。 Binary/@Id
进一步受限,因为它最终成为.MSM文件中流的名称,因此无法查看大约60个字符的内容。
无论如何,最终结果是当在Fragment
中时,编译器将所有可能的规则应用于标识符。在所有情况下,规则可能比绝对必要的限制更多。但是,如果你注意到所有的警告/错误,那么你的代码应该在所有情况下编译。