我正在将我们的安装程序项目从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安装程序?
答案 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);