iT邦幫忙

2021 iThome 鐵人賽

DAY 26
0
Software Development

@30天 | C# WixToolset + WPF 帥到不行的安裝包系列 第 26

@Day26 | C# WixToolset + WPF 帥到不行的安裝包 [Bootstrapper生命週期]

我看InstalViewModel裡面的程式碼時,其實有一些摸不著頭緒的地方,
排除MVVM風格跟我在寫MVC不同外,
主要是有很大的疑問是說BootstrapperApplication的執行順序是什麼?!

尤其InstallViewModel這邊加了很多個事件都跟執行順序有關聯,

我把他所有的事件整理放在一起了後,
最後當我注意到裡面的程式碼順序時

竟然不是很有潔癖的A~Z排序,而是感覺他是一段流程的排序,

所以我開始按照InstalViewModel裡面的事件順序排排看!!! 哈哈

            //25 當引擎開始計劃安裝時觸發
           model.BootstrapperApplication.PlanBegin += PlanBegin;
            //26 當檢測階段完成時觸發。
           model.BootstrapperApplication.DetectComplete += DetectComplete;
            //27 當對特定包的檢測完成時觸發。
           model.BootstrapperApplication.DetectPackageComplete += DetectPackageComplete;
            //30 當引擎完成特定包的安裝規劃時觸發
           model.BootstrapperApplication.PlanPackageComplete += PlanPackageComplete;
            //43 當引擎完成安裝規劃時觸發。
           model.BootstrapperApplication.PlanComplete += PlanComplete;
            //44 當引擎開始安裝包時觸發。
           model.BootstrapperApplication.ApplyBegin += ApplyBegin;
            //46 當引擎完成安裝特定包時觸發。
           model.BootstrapperApplication.ExecutePackageComplete += ExecutePackageComplete;
            //48 當 Windows Installer 發送安裝消息時觸發
           model.BootstrapperApplication.ExecuteMsiMessage += ExecuteMsiMessage;
            //49 當引擎更改捆綁安裝的進度時觸發。
           model.BootstrapperApplication.Progress += ApplyProgress;
            //52 當引擎開始安裝特定包時觸發。
           model.BootstrapperApplication.ExecutePackageBegin += ExecutePackageBegin;
            //54 在引擎緩存安裝源後觸發
           model.BootstrapperApplication.CacheComplete += CacheComplete;
            //60 當引擎有進度獲取安裝源時觸發
           model.BootstrapperApplication.CacheAcquireProgress += CacheAcquireProgress;
            //73 在有效載荷上執行時由引擎觸發。
           model.BootstrapperApplication.ExecuteProgress += ApplyExecuteProgress;
            //74 當引擎完成安裝包時觸發。
           model.BootstrapperApplication.ApplyComplete += ApplyComplete;

看起來好像是生命週期,

但這個不是生命週期!!!

後來查到別人的解釋
https://stackoverflow.com/questions/21018262/wix-bootstrapper-sequence-of-bootstrapper-events

檢查(Detect) > 計畫(Plan)> 執行(Apply)
主要會分三階段,而每階段都是非同步的在執行,

所以實際上系統的執行順序應該為

           //26 當檢測階段完成時觸發。
           model.BootstrapperApplication.DetectComplete += DetectComplete;
            //27 當對特定包的檢測完成時觸發。
           model.BootstrapperApplication.DetectPackageComplete += DetectPackageComplete;
           

  			//25 當引擎開始計劃安裝時觸發
           model.BootstrapperApplication.PlanBegin += PlanBegin;
            //30 當引擎完成特定包的安裝規劃時觸發
           model.BootstrapperApplication.PlanPackageComplete += PlanPackageComplete;
            //43 當引擎完成安裝規劃時觸發。
           model.BootstrapperApplication.PlanComplete += PlanComplete;
           
           
            //44 當引擎開始安裝包時觸發。
           model.BootstrapperApplication.ApplyBegin += ApplyBegin;
            //46 當引擎完成安裝特定包時觸發。
           model.BootstrapperApplication.ExecutePackageComplete += ExecutePackageComplete;
            //48 當 Windows Installer 發送安裝消息時觸發
           model.BootstrapperApplication.ExecuteMsiMessage += ExecuteMsiMessage;
            //49 當引擎更改捆綁安裝的進度時觸發。
           model.BootstrapperApplication.Progress += ApplyProgress;
            //52 當引擎開始安裝特定包時觸發。
           model.BootstrapperApplication.ExecutePackageBegin += ExecutePackageBegin;
            //54 在引擎緩存安裝源後觸發
           model.BootstrapperApplication.CacheComplete += CacheComplete;
            //60 當引擎有進度獲取安裝源時觸發
           model.BootstrapperApplication.CacheAcquireProgress += CacheAcquireProgress;
            //73 在有效載荷上執行時由引擎觸發。
           model.BootstrapperApplication.ExecuteProgress += ApplyExecuteProgress;
            //74 當引擎完成安裝包時觸發。
           model.BootstrapperApplication.ApplyComplete += ApplyComplete;

恩…

這樣程式碼上面的流程也合理了
由 27 DetectPackageComplete() 判斷安裝狀態,
會影響 25 PlanBegin() 依照安裝狀態給 progressPhases 1或2

那實際系統在啟動時
CustomBootstrapperApplication> Run > this.Engine.Detect();
這個Detect()就會去執行Detect判斷安裝狀態了,只是會非同步的回來。



  • 後記

一開始假設得很開心,
只是程式碼流程就不對了,
後來終於有查到解釋...
不然就讓你們看我瞎掰了,哈哈!

Day26程式碼
https://github.com/Aslan7826/defaultMVC/commits/Day26


上一篇
@Day25 | C# WixToolset + WPF 帥到不行的安裝包 [既有的自訂欄位介接]
下一篇
@Day27 | C# WixToolset + WPF 帥到不行的安裝包 [額外的DLL引用]
系列文
@30天 | C# WixToolset + WPF 帥到不行的安裝包30

尚未有邦友留言

立即登入留言