Wix 安装程序在更新时使用默认的应用程序路径,而不是预期的来自注册表

Wix setup uses default Application path on Update and not from registry as expected

我们正在使用 Wix Toolset V3.11 来构建我们的设置。

因为下面的声明,我们默认的安装路径是C:/Program Files(x86)/Acme/AppName

<Property Id="ApplicationFolderName" Value="$(var.Manufacturer)$(var.AppFolderName)"  />
<Property Id="WixAppFolder" Value="WixPerMachineFolder" />

通过设置中的 'Advanced' 按钮,我们将此路径更改为 C:/Program Files(x86)/Acme/FooBar:

以下声明将更改后的路径保存在注册表中:

<RegistryKey
    Key="Software$(var.Manufacturer)$(var.AppName)"
    Root="HKLM">
    <RegistryValue Id="InstallationRegistry"
        Type="string"
        Name="InstallDir"
        Value="[APPLICATIONFOLDER]" />
    </RegistryKey>

通过 Regedit.exe 我可以在注册表中看到路径 C:/Program Files(x86)/Acme/FooBar,正如预期的那样。一切都好。

问题: 但是现在,当我 运行 一个更新的新设置时,所有文件都已从自定义文件夹中移出 C:/Program Files(x86)/Acme/FooBar到默认文件夹 C:/Program Files(x86)/Acme/AppName.

当我执行更新并单击 'Advanced' 按钮时,默认路径 C:/Program Files(x86)/Acme/AppName 被预先分配:

我使用以下标记从注册表中查询路径:

<Property Id="APPLICATIONFOLDER">
    <RegistrySearch Id='InstallationRegistrySearch' Type='raw' Root='HKLM' Key='Software$(var.Manufacturer)$(var.AppName)' Name='InstallDir' />
</Property>

这是相关的标记:

<Fragment>
    <ComponentGroup Id="RootComponents" Directory="APPLICATIONFOLDER">
      <Component Id="RootComponent" Guid="xxxxxxxxx" Win64='yes'>   
        <RegistryKey
          Key="Software$(var.Manufacturer)$(var.AppName)"
          Root="HKLM">
          <RegistryValue Id="InstallationRegistry"
                         Type="string"
                         Name="InstallDir"
                         Value="[APPLICATIONFOLDER]" />
        </RegistryKey>

      </Component>      
    </ComponentGroup>

    [...]


<Product ...>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="PROGRAMFILESPATH" Name="$(var.ProgramFilesPath)">
        <Directory Id="ManufacturerFolder" Name="$(var.Manufacturer)">
          <Directory Id="APPLICATIONFOLDER" Name="$(var.AppFolderName)" >

            <!-- here are the application files (e.g. Appname.exe)-->
            [...]

          </Directory>
        </Directory>
      </Directory>      
    </Directory>


    [...]

    <Property Id="ApplicationFolderName" Value="$(var.Manufacturer)$(var.AppFolderName)"  />
    <Property Id="WixAppFolder" Value="WixPerMachineFolder" />

    <Property Id="APPLICATIONFOLDER">
      <RegistrySearch Id='InstallationRegistrySearch' Type='raw' Root='HKLM' Key='Software$(var.Manufacturer)$(var.AppName)' Name='InstallDir' />
    </Property>

    <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
    <Property Id="ALLUSERS" Value="1"/>

    [...]

    <UI>
      [...]
      <UIRef Id="WixUI_Advanced"/>
    </UI>
</Product>

我们做错了什么?

记住属性:属性 值不会被 MSI 自动神奇地保留,因此需要模式,例如“Remember Property Pattern”。

Bitness: 看起来你正在从注册表中读回,但会不会是你有一个“位数问题”?换句话说,您是从注册表的 x64-section 而不是 x86-section 读取的? (反之亦然)。

  • HKEY_LOCAL_MACHINE\SOFTWARE\Manufacturer\Acme\Program

  • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Manufacturer\Acme\Program