使用自定义UI代码更改代码后面的安装位置

时间:2012-11-29 10:02:40

标签: xaml installer wix wix3.6

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

现在我已经在WPF / XAML(Win 8样式)中创建了一个自定义UI,以及一个使用我们自己的UI安装项目的bootstrapper项目。基础工作正常,即安装和卸载。

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

我的目录树定义如下:

<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安装程序?

1 个答案:

答案 0 :(得分: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);