Wix - ICE60和ICE69警告

JLT*_*T93 8 xml wix

我在使用WiX时遇到了一些问题.我当前的警告是ICE60,它告诉我我的.ttf文件不是字体,它的版本不是伴随文件参考.它应该具有语言列中指定的语言.

此警告的问题是我无法为该文件设置语言版本.根据有关此警告的MSDN文档,我可以通过向字体文件添加版本来禁止它.不完全确定如何!

我的下一个警告是ICE69,不匹配的组件参考.快捷方式表的条目"ApplicationStartMenuShortcut"属于组件"ApplicationShortcut".但是,"Target"列中的格式化字符串引用了属于组件"MyApp.exe"的文件"MyApp.exe".组件具有相同的功能.

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
<?include "config.wxi"?>
<Product Id="*" UpgradeCode="67bd6fc7-c75b-434b-a305-2808541f8185" Version="1.0.0.0" Language="1033" Name="MyApp" Manufacturer="MyApp">

    <Package InstallerVersion="300" Compressed="yes"/>
    <Media Id="1" Cabinet="MyApp.cab" EmbedCab="yes" />

    <PropertyRef Id="NETFRAMEWORK45" />

    <Condition Message="This application requires .NET Framework 4.5. Please install the .NET Framework then run this installer again.">
        <![CDATA[Installed OR NETFRAMEWORK45]]>
    </Condition>

    <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="ProgramFilesFolder">
            <Directory Id="APPLICATIONROOTDIRECTORY" Name="MyApp">
                <Directory Id="RESOURCESDIRECTORY" Name="Resources" />
            </Directory>
        </Directory>
        <Directory Id="ProgramMenuFolder">
            <Directory Id="ApplicationProgramsFolder" Name="MyApp"/>
        </Directory>
    </Directory>

    <Icon Id="_MyApp.ico" SourceFile="$(var.SourceDir)\Resources\MyApp.ico" />
    <Property Id="ARPPRODUCTICON" Value="_MyApp.ico" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />

    <DirectoryRef Id="APPLICATIONROOTDIRECTORY">
        <Component Id="MyApp.exe" Guid="*">
            <File Id="MyApp.exe" Source="$(var.SourceDir)\MyApp.exe" KeyPath="yes" Checksum="yes"/>
        </Component>
        <Component Id="Xceed.Wpf.Toolkit.dll" Guid="*">
            <File Id="Xceed.Wpf.Toolkit.dll" Source="$(var.SourceDir)\Xceed.Wpf.Toolkit.dll" KeyPath="yes" Checksum="yes" />
        </Component>
    </DirectoryRef>
    <DirectoryRef Id="RESOURCESDIRECTORY">
        <Component Id="MyApp.ico" Guid="*">
            <File Id="MyApp.ico" Source="$(var.SourceDir)\Resources\MyApp.ico" KeyPath="yes" />
        </Component>
        <Component Id="FontAwesome.ttf" Guid="*">
            <File Id="FontAwesome.ttf" Source="$(var.SourceDir)\Resources\FontAwesome.ttf" KeyPath="yes" />
        </Component>
    </DirectoryRef>
    <DirectoryRef Id="ApplicationProgramsFolder">
        <Component Id="ApplicationShortcut" Guid="*">
            <Shortcut Id="ApplicationStartMenuShortcut"
                      Name="MyApp"
                      Description="Off-browser chat client for MyApp"
                      Target="[#MyApp.exe]"
                      WorkingDirectory="APPLICATIONROOTDIRECTORY" />
            <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall" />
            <RegistryValue Root="HKCU" Key="Software\Microsoft\MyApp" Name="installed" Type="integer" Value="1" KeyPath="yes" />
        </Component>
    </DirectoryRef>

    <Feature Id="MainApplication" Title="Main Application" Level="1">
        <ComponentRef Id="MyApp.exe" />
        <ComponentRef Id="Xceed.Wpf.Toolkit.dll" />
        <ComponentRef Id="MyApp.ico" />
        <ComponentRef Id="FontAwesome.ttf" />
        <ComponentRef Id="ApplicationShortcut" />
    </Feature>
</Product>
</Wix>
Run Code Online (Sandbox Code Playgroud)

尽管两个警告,应用程序确实安装并正常工作.虽然谁喜欢警告,嗯?

我们非常感谢任何有关这些错误的帮助,我不想完全压制它们只是存在潜在的问题.

Pet*_*iho 29

关于ICE69警告,我以为我会提供一个更全面的讨论,我刚刚通过这个...


ICE69MSDN文档:

跨组件引用的问题源于评估格式化字符串的方式.如果已使用[$ componentkey]属性引用的组件已安装且在当前安装期间未更改(例如,重新安装,移至源等),则表达式[$ componentkey]的计算结果为null,因为[$ componentkey]中组件的操作状态为null.升级和修复操作期间可能会出现类似问题.

文档继续解释当引用跨越不同功能中的组件时,该消息是错误的,因为在引用功能时可能未安装定义功能,从而导致字符串为空值.

当两个组件具有相同的功能时,可能是因为只有一个组件与另一个组件一起安装,因此可以安全地使用该组件.所以你得到一个警告,表明你正在做一些可能不安全的事情但可能会有效.

有很多方法可以解决这个问题,包括:

  • 大锤:只需禁用警告.打开WiX项目的属性,选择"工具设置"选项卡,然后在"抑制特定ICE验证:"字段中输入"ICE69":

在此输入图像描述

  • 实用:通过解释格式化字符串的方式的怪癖,您可以使用语法[!...]而不是[#...]欺骗编译器忽略该问题.从MSI文档:

如果找到[!filekey]形式的子字符串,则将其替换为文件的完整短路径,其值filekey用作File表中的键.只有在Registry或IniFile表的Value列中使用时,此语法才有效.在其他列中使用时,此语法的处理方式与[#filekey]相同.

换句话说,通过[!...]在实际未使用该语法的场景中使用语法,编译器不会执行分析来处理[#...]语法警告,但最终MSI仍将其视为该语法.您已经有效地从编译器中隐藏了该格式化字符串.

  • 理论上的理想:使用广告快捷方式,例如您的其他答案引用的博客文章.显然,这只适用于快捷方式中引用生成警告的情况.:)当然,使用广告快捷方式会带来其他复杂性.但它是一个选项,将摆脱警告(因为Target在这种情况下你甚至没有使用属性,并且没有格式化的字符串).


Jus*_*ess 6

使用以下任何一种工具,您都可以编辑.ttf文件并添加所需的信息。

http://fontforge.org/editexample.html

http://sourceforge.net/projects/ttfedit/

关于不匹配的组件参考,可以安全地忽略正在得到的ICE错误。如果您希望摆脱它,可以改为宣传您的快捷方式。

http://blogs.technet.com/b/alexshev/archive/2008/02/20/from-msi-to-wix-part-10-shortcuts.aspx

否则,您可以抑制该验证错误。

  • 广告捷径是什么意思? (2认同)