@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


<<:  [Day 11] 建立 Baseline — 开启机器学习专案的第一步

>>:  Day17 Mixin 後,搭配 RWD

计算机概论 - 资料处理 Data manipulation

由於大学跟研究所读的是电机工程,所以对於软件业来说我是个半路出家的人,所以在公司与同事交流或是合作的...

参与"在MCU 上全面建构AI能力" 9/10 心得

今晚参与了"MakerPro社群媒体平台"举办的 在MCU 上全面建构AI能力 ...

qrcode 的 generate和decode(python)

generate: import qrcode import argparse def make_q...

远距工作停看听:好处篇

前言 透过系列文章的铺陈,我们可以再跨一步来思考远距工作了,作为一种团队协作思维的转变,为生活与工作...

知名云服务供应商 Liquid Web 收购 WordPress 群众募资外挂 GiveWP

说起群众募资,有时是开始新产品、新服务或各种古怪的新奇事物。但也有典型的例如线上课程、解决某一件社...