使用MajorUpgrade和Version binder时,WiX实例转换失败,错误代码为2229

时间:2014-03-11 21:48:32

标签: wix

我正在使用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绑定器看起来有冲突?

2 个答案:

答案 0 :(得分:0)

简短的回答是,您的转换很可能创建了一个不正确的表。那个错误是“数据库:[2]。无法在SQL查询中加载表'[3]':[4]。”因此,如果您没有消息中的其余错误信息(表名和查询),则使用详细日志进行安装,它应该告诉您哪个表不正确以及正在使用的查询。或者将MSI加载到Orca中,使用菜单应用转换并查看文件表版本以查看它是否有效,或者转换后更改的其他内容。如果它没有进行重大升级,它可能不关心文件版本(因为它不需要应用文件覆盖规则),所以这可能是没有重大升级就可以的原因。

我不清楚你为什么要用变换来做这件事。我相信WiX可以在构建时应用变量版本。

答案 1 :(得分:0)

根据issue 4675,这似乎是针对链接器/ light.exe的错误记录的。 @Dawid Mostert,知道如何从MSI中提取变换会很高兴。我快速浏览了一下,找不到咒语。