我创建了一个安装msi的WIX引导程序应用程序exe。目前,UI将根据用户机器中应用程序的状态显示安装或卸载。然后,用户可以按下此按钮开始安装。现在我希望这个过程自动发生。用户双击exe后,它应该立即开始安装/卸载。UI将只显示进度。这可能吗?下面是我的引导程序bundle.wxs.
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
<Bundle Name="Kube Installer" Version="1.0.0.0" Manufacturer="Zone24x7" UpgradeCode="C82A383C-751A-43B8-90BF-A250F7BC2863">
<BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost" >
<Payload SourceFile="..CustomBABootstrapperCore.config"/>
<Payload SourceFile="..CustomBAbinReleaseCustomBA.dll"/>
<Payload SourceFile="..CustomBAbinReleaseGalaSoft.MvvmLight.WPF4.dll"/>
<Payload SourceFile="C:Program Files (x86)WiX Toolset v3.8SDKMicrosoft.Deployment.WindowsInstaller.dll"/>
</BootstrapperApplicationRef>
<WixVariable Id="WixMbaPrereqLicenseUrl" Value=""/>
<WixVariable Id="WixMbaPrereqPackageId" Value=""/>
<Chain>
<MsiPackage SourceFile="..KubeInstallerbinReleaseKubeInstaller.msi" Id="KubeInstallationPackageId" Cache="yes" Visible="no"/>
</Chain>
</Bundle>
</Wix>
下面是我的ViewModel类,它检查安装状态并相应地启用相关按钮。
public class MainViewModel : ViewModelBase
{
//constructor
public MainViewModel(BootstrapperApplication bootstrapper)
{
this.IsThinking = false;
this.Bootstrapper = bootstrapper;
this.Bootstrapper.ApplyComplete += this.OnApplyComplete;
this.Bootstrapper.DetectPackageComplete += this.OnDetectPackageComplete;
this.Bootstrapper.PlanComplete += this.OnPlanComplete;
this.Bootstrapper.CacheAcquireProgress += (sender, args) =>
{
this.cacheProgress = args.OverallPercentage;
this.Progress = (this.cacheProgress + this.executeProgress) / 2;
};
this.Bootstrapper.ExecuteProgress += (sender, args) =>
{
this.executeProgress = args.OverallPercentage;
this.Progress = (this.cacheProgress + this.executeProgress) / 2;
};
}
#region Properties
private bool installEnabled;
public bool InstallEnabled
{
get { return installEnabled; }
set
{
installEnabled = value;
RaisePropertyChanged("InstallEnabled");
}
}
private bool uninstallEnabled;
public bool UninstallEnabled
{
get { return uninstallEnabled; }
set
{
uninstallEnabled = value;
RaisePropertyChanged("UninstallEnabled");
}
}
private bool isThinking;
public bool IsThinking
{
get { return isThinking; }
set
{
isThinking = value;
RaisePropertyChanged("IsThinking");
}
}
private int progress;
public int Progress
{
get { return progress; }
set
{
this.progress = value;
RaisePropertyChanged("Progress");
}
}
private int cacheProgress;
private int executeProgress;
public BootstrapperApplication Bootstrapper { get; private set; }
#endregion //Properties
#region Methods
private void InstallExecute()
{
IsThinking = true;
Bootstrapper.Engine.Plan(LaunchAction.Install);
}
private void UninstallExecute()
{
IsThinking = true;
Bootstrapper.Engine.Plan(LaunchAction.Uninstall);
}
private void ExitExecute()
{
CustomBA.BootstrapperDispatcher.InvokeShutdown();
}
/// <summary>
/// Method that gets invoked when the Bootstrapper ApplyComplete event is fired.
/// This is called after a bundle installation has completed. Make sure we updated the view.
/// </summary>
private void OnApplyComplete(object sender, ApplyCompleteEventArgs e)
{
IsThinking = false;
InstallEnabled = false;
UninstallEnabled = false;
this.Progress = 100;
}
/// <summary>
/// Method that gets invoked when the Bootstrapper DetectPackageComplete event is fired.
/// Checks the PackageId and sets the installation scenario. The PackageId is the ID
/// specified in one of the package elements (msipackage, exepackage, msppackage,
/// msupackage) in the WiX bundle.
/// </summary>
private void OnDetectPackageComplete(object sender, DetectPackageCompleteEventArgs e)
{
if (e.PackageId == "KubeInstallationPackageId")
{
if (e.State == PackageState.Absent)
InstallEnabled = true;
else if (e.State == PackageState.Present)
UninstallEnabled = true;
}
}
/// <summary>
/// Method that gets invoked when the Bootstrapper PlanComplete event is fired.
/// If the planning was successful, it instructs the Bootstrapper Engine to
/// install the packages.
/// </summary>
private void OnPlanComplete(object sender, PlanCompleteEventArgs e)
{
if (e.Status >= 0)
Bootstrapper.Engine.Apply(System.IntPtr.Zero);
}
#endregion //Methods
#region RelayCommands
private RelayCommand installCommand;
public RelayCommand InstallCommand
{
get
{
if (installCommand == null)
installCommand = new RelayCommand(() => InstallExecute(), () => InstallEnabled == true);
return installCommand;
}
}
private RelayCommand uninstallCommand;
public RelayCommand UninstallCommand
{
get
{
if (uninstallCommand == null)
uninstallCommand = new RelayCommand(() => UninstallExecute(), () => UninstallEnabled == true);
return uninstallCommand;
}
}
private RelayCommand exitCommand;
public RelayCommand ExitCommand
{
get
{
if (exitCommand == null)
exitCommand = new RelayCommand(() => ExitExecute());
return exitCommand;
}
}
#endregion //RelayCommands
}
我不知道您从哪里开始Detect
过程,所以我的假设是您在其他地方开始。但是,看起来确实是在启用OnDetectPackageComplete
方法中的按钮。相反,您可以从OnDetectPackageComplete
方法中调用Plan()
(或调用InstallExecute
或UninstallExecute
包装器)。因此,一旦检测阶段完成,你就会立即进入Plan
阶段,你已经在OnPlanComplete
方法中连接了它,跳到Apply
阶段,给你想要的行为。