0

我正在将我们的安装程序项目从 VS 2008 合并到 VS 2012,然后从基本的 Windows 安装程序合并到 Wix 安装程序。我创建了一个标准的 Wix 安装程序项目,它输出了一个我想要的 MSI。

现在,我创建了一个 WPF/XAML(Win 8 风格)的自定义 UI 和一个使用我们自己的 UI 安装我们的项目的引导程序项目。基础工作很好,即安装和卸载。

我想让用户通过“高级”面板更改安装目录和安装范围(每个用户或每台机器)。我可以在后面的代码中捕获设置,但我无法将这些参数传递给我的安装程序。

我的目录树定义如下:

<Directory Id='TARGETDIR' Name='SourceDir'>
  <Directory Id='ProgramFilesFolder' Name='PFiles'>
     <Directory Id='INSTALLDIR' Name='$(var.ProductName)  $(var.CustomerAcronym) v$(var.Version)'>
        <Component Id='MainService' Guid="5E68A5A7-E9B3-4156-B84C-E8D7AA3DCBCC">

有关如何处理此问题的任何提示,那么如何将用户定义的路径和范围传递给 Wix 安装程序?

4

1 回答 1

1

在您的 UI 中,在引导程序字符串变量中设置安装路径,例如:

BootstrapperApplication.Engine.StringVariables["INSTALLPATH"] = "C:\somePath\someDir";

然后在您的 bundle.wxs 中,将字符串变量作为属性传递,例如:

<MsiPackage SourceFile="MyPackage.msi" Id="MyPackage">
    <MsiProperty Name="INSTALLDIR" Value="[INSTALLPATH]" />
</MsiPackage>

更新

如果目录路径包含符号[],引擎将这部分路径解析为变量:

BootstrapperApplication.Engine.StringVariables["INSTALLPATH"] = "C:\[somePath]\someDir";

在这种情况下,Wix Bundle 中不存在变量 [somePath],因此 INSTALLPATH 将为“C:\someDir”

如果您从 UI 分配目录路径,最好转义变量:

string directoryPathFromUser = "C:\[somePath]\someDir";
BootstrapperApplication.Engine.StringVariables["INSTALLPATH"] = 
    BootstrapperApplication.Engine.EscapeString(directoryPathFromUser);
于 2012-11-29T14:29:27.657 回答