Wix Managed bootstrapper应用程序:通过bundle

时间:2017-03-21 02:11:25

标签: c# wpf wix windows-installer

我在WPF中为我的Wix Bundle创建了一个自定义UI,覆盖了Bootstrapper应用程序类,我正在努力处理一个我需要访问和修改的变量,如果需要的话。此变量是引导程序部署的msi的安装文件夹路径(字符串)。

我遵循了我在许多论坛上发现的内容,但它无法正常工作,我无法访问此变量。这是我的代码:

Msi安装程序:

<Product ...>
  <Feature ...
           ConfigurableDirectory="INSTALLFOLDER"
           ...>
</Product>

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder">
    <Directory Id="ManufacturerFolder" Name="...">
      <Directory Id="INSTALLFOLDER" Name="!(bind.property.ProductName)"/>
    </Directory>
  </Directory>
</Directory>

软件包:

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

<Chain>
      <MsiPackage ...
                  ForcePerMachine="yes"
                  Compressed="no"
                  Visible="no"
                  EnableFeatureSelection="yes"
                  Vital="yes">
        <MsiProperty Name="INSTALLFOLDER" Value="[InstallFolder]" />
      </MsiPackage>
      ...
</Chain>

C#托管引导程序应用程序:

if (Bootstrapper.Engine.StringVariables.Contains("InstallFolder"))
  installFolder = Bootstrapper.Engine.StringVariables["InstallFolder"];

&#34; installFolder&#34;变量总是空的...我真的不知道我的代码有什么问题。希望可以有人帮帮我。谢谢

  

编辑:

     

我按照Pavel的建议修改了bundle变量并使用了默认值   值,现在即使我仍然无法获得MSI返回的值,我   可以将Bootstrapper.Engine.StringVariables [&#34; InstallFolder&#34;]设置为   值并且它正确传递给msi。

3 个答案:

答案 0 :(得分:0)

如果我没记错,刻录变量默认为数字类型。

所以,请尝试明确指定您的变量类型。您还可以指定默认值:

<Variable Name="InstallFolder" Type="string" Value="[ProgramFilesFolder]!(bind.packageName.YourMsiPackageId)" Persisted="yes"/>

也许你还应该添加Persisted =&#34; yes&#34;如果安装程序在安装过程中需要重新启动,则保留该值。

答案 1 :(得分:0)

这里回答了同样的问题 - Cannot read input from Bootstrapper variable in Managed Bootstrapper Application C#-Code

简短版本:您还必须通过Bootstrapper.Command.GetCommandLineArgs()手动解析命令行参数并写入Bootstrapper.Engine.StringVariables["variable"]

答案 2 :(得分:0)

好吧,谢谢帕维尔,我现在明白了它的运作方式:

在wix包中,要更改msi变量,需要设置默认值,在我的例子中是:

<Variable Name="InstallFolder" Type="string" Value="[INSTALLFOLDER]" Persisted="yes"/>

此默认值对应于msi中的实际默认值。有了这个,我可以从我的c#代码中访问这个变量,并在需要时通过执行以下操作进行更改:

Bootstrapper.Engine.StringVariables["InstallFolder"] = value;