【问题标题】:Change install location in code behind with custom UI code使用自定义 UI 代码更改代码后面的安装位置
【发布时间】:2012-11-17 08:59:34
【问题描述】:

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

【问题讨论】:

    标签: xaml installation wix wix3.6


    【解决方案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 中获取目录路径,最好使用 Escape 变量:

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

    【讨论】:

    • 谢谢!如此简单,但我在任何地方都找不到。我猜同样的方法适用于范围(安装所有用户与安装此用户)?
    • 我认为是这样,但您必须确保在安装程序中,您专门将 ALLUSERS 属性设置为您想要的值,而不是设置 元素的 InstallScope 属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多