2015-11-04 60 views
0

在我的msi中,我必須使用一些參數調用已安裝的exe文件,作爲卸載的第一個操作。下面是代碼:Wix:執行已安裝的exe作爲卸載的第一個動作

<CustomAction Id="UnRegisterOnUninstallApplication" 
       Execute="immediate" 
       FileKey="MyProgram.exe" ExeCommand="/unregister" Return="asyncNoWait" /> 

<InstallExecuteSequence> 
    <RemoveExistingProducts After="InstallInitialize"/> 
    <Custom Action="UnRegisterOnUninstallApplication" Before="UnpublishComponents" >Installed AND NOT UPGRADINGPRODUCTCODE</Custom> 
</InstallExecuteSequence> 

雖然,它計劃UnpublishComponents之前,但問題是,在某些計算機,自定義操作過程中或依賴的DLL後調用被卸載等MyProgram.exe崩潰這裏。 這似乎是不可預知的...

任何人都可以請引導,如果我失去了一些東西或做錯了什麼? 謝謝你一堆。

回答

0

我可能會在'RemoveFiles'之前安排操作,以便在您的自定義操作運行之前沒有刪除相關的dll。

2

有幾件事情在這裏不正確:

  1. 設計的問題是,你不應該運行的代碼註冊或註銷。推薦的方法是捕獲註冊表項並將它們作爲註冊表項添加到與該二進制文件相同的組件中。那麼這一切都是正常的。

  2. 您的自定義操作是asyncNoWait,這意味着程序運行時繼續卸載。如果由於某種原因需要很長時間,或者只是沒有足夠的處理器,那麼是的,文件在運行時可能已被刪除。

  3. 這是一個直接的自定義操作,因此它可以在卸載過程中運行並開始取消註冊。但是,如果卸載失敗並回滾,刪除的註冊將不會被恢復,因此最終仍然會安裝破損的產品,這些註冊條目將保留刪除。它應該是延遲自定義操作,並且返回=忽略或檢查,具體取決於您是否在意程序是否失敗。

相關問題