23

我正在使用 VS 2010 创建一个由 Wix 安装的程序,并且我已经准备好 product.wxs。

在我的 wxs 文件中,我的目录定义如下所示:

<SetDirectory Id="INSTALLFOLDER" Value="[WindowsVolume]Myapp" />
<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="INSTALLFOLDER" Name="Myapp">
    <Directory Id="Myapp_Installer_Dir" Name="Myapp">
          <Directory Id="BIN" Name="Bin" />
          <Directory Id="ICONS" Name="Icons" />
    </Directory>
  </Directory>
</Directory>

然后我得到了这些文件安装定义:

<DirectoryRef Id="Myapp_Installer_Dir">
  <Component Id="INSTALLER_Myapp" Guid="{94F18477-8562-4004-BC6F-5629CC19E4CB}" >
    <File Source="$(var.Myapp.TargetPath)" KeyPath="yes"/>
  </Component>
</DirectoryRef>

<DirectoryRef Id="BIN">
  <Component Id="INSTALLER_Data" Guid="{545FB5DD-8A52-44D7-898E-7316E70A93F5}" >
    <File Source="$(var.Data.TargetPath)" KeyPath="yes"/>
  </Component>
    ...

它以这种方式继续。“ICONS”目录的文件也被定义。

我还使用了 WixUI_InstallDir 对话框集,并且也出现了这些行:

<Property Id="WIXUI_INSTALLDIR" Value="Myapp_Installer_Dir" />
<UIRef Id="WixUI_InstallDir" />

问题是当用户安装程序并更改安装文件夹的值时,“Bin”和“Icons”的文件安装到正确的路径,但 Myapp 目标安装到定义的修复位置start 作为默认安装路径。

为什么只将 bin 和 icon 文件安装到用户想要的正确文件夹中,而 myapp 目标却没有?

4

3 回答 3

41

我终于弄清楚了问题所在。搜索了一段时间后,我发现了这个文档:

WixUI_InstallDir 对话框集

相关部分:“目录ID必须全部为大写字符,因为它必须从UI传递到执行序列才能生效。”

正如您在我的代码中看到的那样:“Myapp_Installer_Dir”不符合此标准。

将其更改为“MYAPPINSTALLERDIR”后,一切正常。

于 2013-10-15T13:28:53.790 回答
3

我不太确定,但这就是我认为已经发生的事情。

当您创作一个SetDirectory元素时,您基本上添加了一个自定义操作,该操作将一个目录设置到 MSI 数据库。只要不指定执行的顺序,默认为both,即同时执行InstallUISequenceInstallExecuteSequence

现在,当用户在向导中更改安装目录时,这会在 UI 序列中发生。显然,当安装进入执行序列时, 的值INSTALLFOLDER被设置[WindowsVolume]Myapp为它所指示的值。

因此,您必须以某种方式对其进行返工。还要记住静默安装——那里只有执行序列。

更新而不是你所拥有的,尝试这样的事情:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="WindowsVolume">
    <Directory Id="INSTALLFOLDER" Name="Myapp">
      <Directory Id="BIN" Name="Bin" />
      <Directory Id="ICONS" Name="Icons" />
    </Directory>
  </Directory>
</Directory>

并让用户INSTALLFOLDER像现在一样随意更改。

于 2013-10-14T09:47:42.883 回答
0

除了大写字母的陷阱之外,还有另一个陷阱:

您必须将可更改目录的 ID 标记为安全。(至少当安装程序以管理员权限运行时。)

与 Yonatan 的答案相关,MYAPPINSTALLERDIR您必须添加以下目录 ID:

<Property Id="MYAPPINSTALLERDIR" Secure="yes" />

与 WiX 文档中的示例WixUI_InstallDir相关,您必须添加以下内容:

<Property Id="TESTFILEPRODUCTDIR" Secure="yes" />

不幸的是,WiX 示例中没有提到这个重要的事实。

于 2021-04-07T11:11:04.767 回答