I am creating a WPF setup application with a custom user interface. I started with the tutorial of Bryan P. Johnston: http://bryanpjohnston.com/2012/09/28/custom-wix-managed
One missing property "Type" on Bundle Variable element. caverman_dick is right but this not works properly when not overridable. You can try this too, setting Type="string".
Wix Variable Element
<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>
I also use this legendary tutorial. I wanted to use veriable for something else. Namely, the variable says whether the program should be installed. The problem is that the variable does not overwrite when invoke it in InstallExecute(). For my problem it work in this way:
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);
}
Bootstrapper:
<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 = "true""/>
Yes just create a variable in your burn bootstrapper:
<Variable Name="BurnVariable"
bal:Overridable="yes" />
you can then pass this as a parameter to your boot-strapped msi package:
<MsiPackage SourceFile="$(var.YourMsiProject.Installer.TargetPath)" Compressed="no">
<MsiProperty Name="INSTALLLOCATION" Value="[BurnVariable]" />
</MsiPackage>