5

我正在创建一个带有自定义用户界面的 WPF 设置应用程序。我从 Bryan P. Johnston 的教程开始:http: //bryanpjohnston.com/2012/09/28/custom-wix-managed-bootstrapper-application/

在我看来,我有一个简单TextBox的绑定到InstallationPath我的MainViewModel.

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

private void InstallExecute()
{
    Bootstrapper.Engine.Plan(LaunchAction.Install);
}

如何使软件包安装到我的财产目录中InstallationPath


编辑:

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

在刻录管理的引导程序中指定 WiX 中软件包的 INSTALLLOCATION

答案来自 Bob Arnson

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

现在,我想我可以StringVariablesInstallExecute这样访问

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

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

4

3 回答 3

7

是的,只需在您的刻录引导程序中创建一个变量:

<Variable Name="BurnVariable"
          bal:Overridable="yes" />

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

<MsiPackage SourceFile="$(var.YourMsiProject.Installer.TargetPath)" Compressed="no">
    <MsiProperty Name="INSTALLLOCATION" Value="[BurnVariable]" />          
</MsiPackage>
于 2013-02-22T11:38:06.477 回答
1

Bundle Variable 元素上缺少一个属性“Type”。caverman_dick 是对的,但是当不可覆盖时,它不能正常工作。你也可以试试这个,设置 Type="string"。

蜡可变元素

<Wix>...<Bundle>...
  <Variable Name="MyApplicationMsiInstallFolder" Value="[WindowsVolume]MyApplication"
          bal:Overridable="yes" Type="string"/>
    <Chain>
        <?if $(var.DbVersion) = false?>
        <PackageGroupRef Id="AccessDatabaseGroup"/>
        <RollbackBoundary />
        <?endif?>
        <MsiPackage Id="MyApplicationMsiPackage" SourceFile="$(var.MyApplicationSetup.TargetPath)" DisplayInternalUI="no"
                                Vital="yes" >
            <MsiProperty Name="APPLICATIONFOLDER" Value="[MyApplicationMsiInstallFolder]"/>
        </MsiPackage>
    </Chain>
</Bundle></Wix>
于 2015-06-19T02:32:29.037 回答
0

我也用这个传奇的教程。我想用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="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;"/>
于 2020-05-12T11:11:00.313 回答