无法从托管引导程序应用程序 C#-代码中的引导程序变量读取输入

Posted

技术标签:

【中文标题】无法从托管引导程序应用程序 C#-代码中的引导程序变量读取输入【英文标题】:Cannot read input from Bootstrapper variable in Managed Bootstrapper Application C#-Code 【发布时间】:2014-09-24 08:38:19 【问题描述】:

我已使用托管引导程序应用程序对设置进行了编程。 在我的解决方案中有以下项目: - Setup.msi:要安装的 MSI 项目 - Setup.UI.dll:用于安装过程的 WPF-GUI - Bootstrapper.exe:引导程序项目 - Launcher.exe : 用于启动引导程序的 WPF 应用程序

在引导程序包中,我为安装文件夹定义了一个变量:

<Variable Name="INSTALLFOLDER"
          bal:Overridable="yes"
          Type="string"
          Value="[ProgramFilesFolder]"/>

这个变量可以由启动器在启动引导程序时设置:

    Process proc = new Process();
    proc.StartInfo.FileName = "msiexec";
    proc.StartInfo.FileName = "..\\..\\..\\Bootstrapper\\bin\\Debug\\Bootstrapper.exe";
    proc.StartInfo.Arguments = "IsClientSetup=true INSTALLFOLDER=C:\\TestSetup";
    proc.Start();

如果我使用标准引导程序 (WixStandardBootstrapperApplication.RtfLicense),我给定的条目将用于定义的变量 INSTALLFOLDER。 我在安装过程中只看到引导程序对话框,但一切都很好。

但是当我使用启动 WPF-GUI 的托管引导程序并尝试读取安装路径时,我总是从定义中获取默认值:programfilesfolder。

这里是捆绑包中的代码:

<WixVariable Id="WixMbaPrereqPackageId"
             Value="Netfx4Full" />
<WixVariable Id="WixMbaPrereqLicenseUrl"
             Value="NetfxLicense.rtf" />
<BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost" >
    <Payload Name='BootstrapperCore.config' SourceFile='..\..\..\Setup.UI\bin\Debug\BootstrapperCore.config' />
    <Payload SourceFile='..\..\..\Setup.UI\bin\Debug\SetupUI.dll' />
</BootstrapperApplicationRef>

<Chain>
    <MsiPackage Id="SetupPackage"
                SourceFile="..\..\..\Setup.Msi\bin\Debug\Setup.msi"
                Cache="yes"
                DisplayInternalUI="no"
                Vital="yes"
                Compressed="no"
                EnableFeatureSelection="no"
                DisplayName="SetupForTest">
        <MsiProperty Name="INSTALLLOCATION"
                     Value="[INSTALLFOLDER]" />
</Chain>

以及来自 SetupUI 中 ViewModel 的代码:

string installationPath = UI.Model.Bootstrapper.Engine.FormatString(UI.Model.Bootstrapper.Engine.StringVariables["INSTALLFOLDER"]);

而且 - 至少 - SetupUI 中的 Run 方法:

protected override void Run()

    MessageBox.Show("1 = " + this.Engine.FormatString(this.Engine.StringVariables["INSTALLFOLDER"]));
    Model = new Model(this);
    Model.Bootstrapper.Engine.Detect();
    MessageBox.Show("2 = " + Model.Bootstrapper.Engine.FormatString(Model.Bootstrapper.Engine.StringVariables["INSTALLFOLDER"]));

    RootViewViewModel viewModel = new RootViewViewModel();
    View = new RootView(viewModel);

    // Populate the view models with data then run the view..
    viewModel.Refresh();
    View.Run();

    this.Engine.Quit(0);

谁能告诉我,我做错了什么?

【问题讨论】:

【参考方案1】:

我自己找到了! 代码是正确的,但是当使用托管引导程序时,变量不会被覆盖。 所以我们必须从 BootstrapperApplication 的 CommandLineArguments 在 SetupUI 中读取它们并将它们设置在变量中。 就是这样。

【讨论】:

以上是关于无法从托管引导程序应用程序 C#-代码中的引导程序变量读取输入的主要内容,如果未能解决你的问题,请参考以下文章

托管引导程序应用程序“无法解析文件源”

[Wix Bundle Managed Bootstrapper]错误 0x80070002:无法创建托管引导程序应用程序

如何从Wix托管引导程序或自定义操作中读取某些注册表项?

托管引导程序:提示输入源时失败

托管的 WiX 引导程序包

Wix 托管引导程序应用程序:通过捆绑将变量传递给 msi