一部分涉及註冊插件的第三方產品重新啓動服務。當第三方服務正在運行時,它會加載我們的DLL,因此磁盤上的文件被鎖定。WiX的卸載程序:如果我們的應用程序的當前
因此,當我們卸載我們的產品,我們需要停止第三方服務開始,然後重新啓動它,當我們與卸載完成。 (我們也做同樣的停止/恢復的事情在安裝時,因爲如果這是升級,那麼現有的文件將被再次鎖定)
維克斯有處理的幸福路徑的命令,沒有問題:
<ServiceControl Id="SomeUniqueId" Name="NameOfTheirService"
Start="both" Stop="both"/>
即在兩個安裝和卸載開始停止服務,並在這兩個安裝和卸載年底重新啓動。到現在爲止還挺好。
問題就來了,如果最終用戶首先卸載第三方應用程序,然後嘗試卸載我們的應用程序。我們的應用程序不會與第三方服務一起使用,但如果用戶想要同時卸載它們,則沒有任何事情可以強制他們按特定順序進行操作。但是,如果不再安裝的第三方服務,那麼我們的卸載程序:
- 試圖阻止第三方服務失敗,因爲該服務不再存在,決定了失敗並不重要,並繼續。
- 卸載我們的產品。
- 嘗試重新啓動第三方服務失敗,因爲該服務不再存在,決定這個失敗是重要的,並提出一個錯誤對話框說:「服務'NameOfTheirService'(NameOfTheirService)無法啓動。你有足夠的權限來啓動系統服務。「 (重試/取消)
- 如果用戶單擊重試,轉到3.
- 如果用戶單擊取消,回滾並取消卸載。
換句話說,維克斯的錯誤處理是錯誤的。停止服務應該是容錯的,而且是。 安裝後啓動服務可能是不能容忍的;這很好:如果服務無法啓動,則無法安裝。但在卸載後啓動服務應該是容錯的,而不是。
如何卸載後重新啓動服務,如果該服務不再存在則不卸載?