C# WiX:如何访问/更改托管引导程序中的安装目录?

C# WiX:如何访问/更改托管引导程序中的安装目录?,c#,wix,bootstrapper,C#,Wix,Bootstrapper,我正在创建一个带有自定义用户界面的WPF安装应用程序。我从Bryan P.Johnston的教程开始: 在我的视图中,我有一个简单的文本框,它绑定到我的MainViewModel中的属性InstallationPath 现在,我希望在用户单击“安装”时使用此路径。为此,我有一个按钮绑定到我的InstallCommand。调用以下方法(直接取自教程): 如何将软件包安装到我的属性InstallationPath的目录中 编辑: 我在Stackoverflow上发现了一个类似的问题: 答案来自鲍

我正在创建一个带有自定义用户界面的WPF安装应用程序。我从Bryan P.Johnston的教程开始:

在我的视图中,我有一个简单的
文本框
,它绑定到我的
MainViewModel
中的属性
InstallationPath

现在,我希望在用户单击“安装”时使用此路径。为此,我有一个按钮绑定到我的
InstallCommand
。调用以下方法(直接取自教程):

如何将软件包安装到我的属性
InstallationPath
的目录中


编辑:

我在Stackoverflow上发现了一个类似的问题:

答案来自鲍勃·阿森

使用每个MsiProperty包的MsiProperty子项指定INSTALLLOCATION=[BurnVariable]。然后使用Engine.StringVariables设置BurnVariable

现在,我想我可以像这样访问我的
InstallExecute
中的
StringVariables

private void InstallExecute()
{
    Bootstrapper.Engine.StringVariables["BurnVariable"] = InstallationPath;
    Bootstrapper.Engine.Plan(LaunchAction.Install);
}

但是在哪里定义这个变量呢?我想在Product.wxs中的某个地方?

是的,在burn引导程序中创建一个变量:

<Variable Name="BurnVariable"
          bal:Overridable="yes" />
<Variable Name="SqlStatus" bal:Overridable="yes" Value="false" Type="string"/>
<Variable Name="SsmsStatus" bal:Overridable="yes" Value="false" Type="string"/>
...

<ExePackage Id="SSMS" Name="SQLServerManagementStudio" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes"
    InstallCommand="/install /Passive SSMSInstallRoot=C:\\Program Files\\Microsoft SQL Server /norestart"
    SourceFile="C:\Users\..\Downloads\SSMS-Setup-ENU.exe"
    DetectCondition="SsmsStatus = &quot;true&quot;"/>

然后,您可以将其作为参数传递给引导msi包:

<MsiPackage SourceFile="$(var.YourMsiProject.Installer.TargetPath)" Compressed="no">
    <MsiProperty Name="INSTALLLOCATION" Value="[BurnVariable]" />          
</MsiPackage>

Bundle变量元素缺少一个属性“Type”。 caverman_dick是对的,但这在不可重写时不能正常工作。 您也可以尝试,设置Type=“string”

。。。。。。

我也使用这个传奇教程。我想用veriable做点别的。也就是说,变量表示是否应该安装程序。问题在于,在InstallExecute()中调用变量时,该变量不会覆盖。对于我的问题,它是这样工作的:

  protected override void Run()
    {
        this.Engine.Log(LogLevel.Verbose, "Launching custom TestBA UX");
        BootstrapperDispatcher = Dispatcher.CurrentDispatcher;


        MainViewModel viewModel = new MainViewModel(this);
        viewModel.Bootstrapper.Engine.Detect();

        MainView view = new MainView();
        this.Engine.StringVariables["SqlStatus"] = view.CheckInstalledSQL() == true ? "true" : "false";
        this.Engine.StringVariables["SsmsStatus"] = view.CheckInstalledSSMS() == true ? "true" : "false";
        view.DataContext = viewModel;
        view.Closed += (sender, e) => BootstrapperDispatcher.InvokeShutdown();
        view.Show();
        Dispatcher.Run();

        this.Engine.Quit(0);
    }
引导程序:

<Variable Name="BurnVariable"
          bal:Overridable="yes" />
<Variable Name="SqlStatus" bal:Overridable="yes" Value="false" Type="string"/>
<Variable Name="SsmsStatus" bal:Overridable="yes" Value="false" Type="string"/>
...

<ExePackage Id="SSMS" Name="SQLServerManagementStudio" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes"
    InstallCommand="/install /Passive SSMSInstallRoot=C:\\Program Files\\Microsoft SQL Server /norestart"
    SourceFile="C:\Users\..\Downloads\SSMS-Setup-ENU.exe"
    DetectCondition="SsmsStatus = &quot;true&quot;"/>

...

谢谢!这正是我想要的。:-)嘿,Michael,我遵循了同样的教程,我面临一个问题,在主要升级过程中,由于新的exe是并排安装的,所以之前的exe不会被删除。我增加了EXE版本和包含的MSIs版本。我看到其他一些人在教程下面评论同样的问题。你遇到这个问题了吗?如果是这样,你是如何克服的(需要一些帮助吗?我也使用这本传奇教程,问题是变量没有覆盖。我的变量返回是否安装程序的信息。我可以在程序c#中读取此变量,但不能覆盖,无论何时何时,它都不会更改。Bootstrapper.Engine.StringVariables[“SqlStatus”]“错”,也许有人能帮我。