我和WiX有一些问题。我当前的警告是ICE60,它告诉我我的.ttf文件不是字体,它的版本不是配套的文件引用。它应该在language列中指定语言。
此警告的问题是我无法为该文件设置语言版本。根据关于这个警告的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>尽管有这两个警告,但应用程序确实安装并工作正常。不过,谁会喜欢警告呢?
对这些错误的任何帮助都是非常感谢的,我不想完全抑制它们,只是以防有潜在的问题。
发布于 2014-01-25 04:34:27
下面的任一工具都允许您编辑.ttf文件并添加所需的信息。
http://fontforge.org/editexample.html
http://sourceforge.net/projects/ttfedit/
关于不匹配的组件引用,您得到的ICE错误可以安全地忽略。如果你想摆脱它,你可以广告你的快捷方式。
https://docs.microsoft.com/en-us/archive/blogs/alexshev/from-msi-to-wix-part-10-shortcuts
否则,您可以抑制该验证错误。
发布于 2015-07-03 03:24:58
关于ICE69的警告,我想我应该提供一个更全面的讨论,因为我刚刚经历了这个…
跨组件引用的
问题源于格式化字符串的求值方式。如果已安装使用$componentkey属性引用的组件,并且在当前安装过程中未更改该组件(例如,重新安装、移至源代码等),则表达式$componentkey的计算结果为null,因为$componentkey中该组件的操作状态为null。在升级和修复操作过程中可能会出现类似的问题。
文档继续解释说,当引用跨不同功能中的组件时,消息是错误,因为在安装引用功能时可能没有安装定义功能,从而导致字符串为空值。
当两个组件在同一功能中时,可能是因为其中一个组件只与另一个组件一起安装,所以可以安全地使用字符串。因此,你会得到一个警告,表明你正在做一些潜在的不安全的事情,但这可能是可行的。
有许多方法可以解决这个问题,包括:

[!...]而不是[#...],并欺骗编译器忽略该问题。来自the MSI documentation如果找到!filekey形式的子字符串,则将其替换为文件的完整短路径,并将值filekey用作文件表中的关键字。只有在注册表或IniFile表的值列中使用时,此语法才有效。在其他列中使用时,此语法被视为与#filekey相同。
换句话说,通过在实际不使用该语法的场景中使用MSI语法,编译器不会进行分析来处理[#...]语法的警告,但最终[!...]仍然将其视为该语法。您已经有效地对编译器隐藏了该格式化字符串。
理想的
Target属性,并且没有格式化字符串)。https://stackoverflow.com/questions/21320334
复制相似问题