我在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。
答案 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;