2016-04-17 5 views
0

Я создал приложение WST для начальной загрузки, которое устанавливает msi. В настоящее время пользовательский интерфейс отобразит установку или удаление на основе состояния приложения на машине пользователя. Затем пользователь может нажать эту кнопку, чтобы начать установку. Теперь я хочу, чтобы этот процесс выполнялся автоматически. Он должен начать установку/удаление, как только пользователь дважды щелкнет по exe. Пользовательский интерфейс будет показывать только прогресс. Это возможно? Ниже приведена моя bootstrapper bundle.wxs.Автоматический запуск установки загрузчика WIX Burn без вмешательства пользователя

<?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="..\CustomBA\BootstrapperCore.config"/> 
     <Payload SourceFile="..\CustomBA\bin\Release\CustomBA.dll"/> 
     <Payload SourceFile="..\CustomBA\bin\Release\GalaSoft.MvvmLight.WPF4.dll"/> 
     <Payload SourceFile="C:\Program Files (x86)\WiX Toolset v3.8\SDK\Microsoft.Deployment.WindowsInstaller.dll"/> 
    </BootstrapperApplicationRef> 
    <WixVariable Id="WixMbaPrereqLicenseUrl" Value=""/> 
    <WixVariable Id="WixMbaPrereqPackageId" Value=""/> 
    <Chain> 
     <MsiPackage SourceFile="..\KubeInstaller\bin\Release\KubeInstaller.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 
    } 

ответ

1

Я не вижу, где вы начинаете с Detect процесс, так что мое предположение, что вы делаете что-то еще. Но похоже, что вы включаете кнопки в свой метод OnDetectPackageComplete. Вместо этого вы можете просто позвонить Plan() (или позвонить InstallExecute или UninstallExecute обертки) из вашего метода OnDetectPackageComplete. Таким образом, как только этап обнаружения будет завершен, вы сразу же зайдете на фазу Plan, которую вы уже подключили в своем методе , чтобы перейти на фазу Apply, давая вам поведение, которое вы желаете.

Смежные вопросы