Xaml 使用自定义UI代码更改代码隐藏中的安装位置

Xaml 使用自定义UI代码更改代码隐藏中的安装位置,xaml,installation,wix,wix3.6,Xaml,Installation,Wix,Wix3.6,我正在将我们的安装程序项目从VS2008合并到VS2012,然后从基本Windows安装程序合并到Wix安装程序。我已经创建了一个标准的Wix安装程序项目,它输出一个我想要的MSI 现在,我已经用WPF/XAML(Win8样式)创建了一个自定义UI,并创建了一个引导程序项目,该项目使用我们自己的UI安装我们的项目。安装和卸载的基础工作正常 我想让用户通过“高级”面板更改安装目录和安装范围(每个用户或每台机器)。我可以在代码隐藏中捕获设置,但无法将这些参数传递给我的安装程序 我的目录树定义如下:

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

现在,我已经用WPF/XAML(Win8样式)创建了一个自定义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安装程序?

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

BootstrapperApplication.Engine.StringVariables["INSTALLPATH"] = "C:\somePath\someDir";
<MsiPackage SourceFile="MyPackage.msi" Id="MyPackage">
    <MsiProperty Name="INSTALLDIR" Value="[INSTALLPATH]" />
</MsiPackage>
然后在bundle.wxs中,将字符串变量作为属性传入,类似于:

BootstrapperApplication.Engine.StringVariables["INSTALLPATH"] = "C:\somePath\someDir";
<MsiPackage SourceFile="MyPackage.msi" Id="MyPackage">
    <MsiProperty Name="INSTALLDIR" Value="[INSTALLPATH]" />
</MsiPackage>
在这种情况下,Wix包中不存在变量[somePath],因此INSTALLPATH将为“C:\someDir”

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

BootstrapperApplication.Engine.StringVariables["INSTALLPATH"] = "C:\[somePath]\someDir";
string directoryPathFromUser = "C:\[somePath]\someDir";
BootstrapperApplication.Engine.StringVariables["INSTALLPATH"] = 
    BootstrapperApplication.Engine.EscapeString(directoryPathFromUser);

谢谢很简单,但我在任何地方都找不到。我猜同样的方法也适用于作用域(安装所有用户与安装此用户)?我认为是这样,但您必须确保在安装程序中,您专门将ALLUSERS属性设置为所需的值,而不是设置元素的InstallScope属性。