我正在使用WiX创建多实例安装程序。我生成的msi正确安装了默认实例,但在尝试安装转换实例时失败。
在尝试隔离问题时,我发现问题似乎与MajorUpgrade标记和我对Product Version属性使用FileVersion binder变量之间的交互有关。
我的测试代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*"
Name="TestArea"
Language="1033"
Version="!(bind.FileVersion.ExeFile)"
Manufacturer="Company"
UpgradeCode="1C0E8BC6-6BD8-4A9D-9A36-14A898E4391B">
<Package InstallerVersion="200" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A more recent version is already installed." />
<MediaTemplate />
<Property Id="INSTANCEID" Value="Default" Secure="yes" />
<InstanceTransforms Property="INSTANCEID">
<Instance Id="Install2" ProductCode="*" UpgradeCode="38C61306-2B32-4475-A889-716BCBF196CA" ProductName="Instance 2" />
</InstanceTransforms>
<UIRef Id="WixUI_InstallDir" />
<UIRef Id="WixUI_ErrorProgressText" />
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" />
<Feature Id="ProductFeature" Title="TestArea" Level="1" ConfigurableDirectory='INSTALLDIR'>
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLDIR" Name="TestArea" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLDIR">
<Component Id="ProductComponent">
<File Id="ExeFile" KeyPath="yes" Source="C:\MyFolder\MyFile.exe" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
当我运行msiexec /i TestInstall.msi
时,默认实例已正确安装。
当我运行msiexec /i TestInstall.msi MSINEWINSTANCE=1 TRANSFORMS=":Install2"
时,我收到消息:
安装程序在安装此安装程序时遇到意外错误 包。这可能表明此包装存在问题。错误代码 是2229。
如果我使用详细日志运行,则错误显示为&#34;无法加载表&#39;升级&#39;在SQL查询&#34;:
Action: FindRelatedProducts. Searching for related applications
Action start: FindRelatedProducts.
Transforming table Upgrade.
Note: 1: 2251 2: 3: Upgrade
Note: 1: 2229 2: 3: Upgrade 4: SELECT `UpgradeCode`,`VersionMin`,`VersionMax`,`Language`,`Attributes`,`ActionProperty` FROM `Upgrade`
DEBUG: Error 2229: Database: . Could not load table 'Upgrade' in SQL query: SELECT `UpgradeCode`,`VersionMin`,`VersionMax`,`Language`,`Attributes`,`ActionProperty` FROM `Upgrade`
但是,如果我删除MajorUpgrade标记,则第二个实例也会正确安装。
此外,如果我更换Version =&#34;!(bind.FileVersion.ExeFile)&#34;使用硬编码值,例如Version =&#34; 3.3.3.3&#34;,第二个实例也会正确安装。
导致此错误的原因是什么?我应该怎么做才能安装实例转换,因为我想保持MajorUpgrade和Version绑定器看起来有冲突?
答案 0 :(得分:0)
简短的回答是,您的转换很可能创建了一个不正确的表。那个错误是“数据库:[2]。无法在SQL查询中加载表'[3]':[4]。”因此,如果您没有消息中的其余错误信息(表名和查询),则使用详细日志进行安装,它应该告诉您哪个表不正确以及正在使用的查询。或者将MSI加载到Orca中,使用菜单应用转换并查看文件表版本以查看它是否有效,或者转换后更改的其他内容。如果它没有进行重大升级,它可能不关心文件版本(因为它不需要应用文件覆盖规则),所以这可能是没有重大升级就可以的原因。
我不清楚你为什么要用变换来做这件事。我相信WiX可以在构建时应用变量版本。
答案 1 :(得分:0)
根据issue 4675,这似乎是针对链接器/ light.exe的错误记录的。 @Dawid Mostert,知道如何从MSI中提取变换会很高兴。我快速浏览了一下,找不到咒语。