2014-01-20 124 views
2

我正在使用WIX創建我的應用程序的安裝程序。 在卸載應用程序的過程中,我想在卸載程序刪除DLL文件所屬的文件之前調用DLL文件中的函數。我檢查了其他相關的帖子,如this post繼續。卸載期間WIX中的自定義操作

我創建了一個CustomAction如下:

<CustomAction Id="UnRegister" 
       FileKey="mydll.dll" 
       DllEntry="cleanup" 
       Execute="immediate" 
       Return="ignore"/> 

然後InstallExecuteSequence標籤:

<InstallExecuteSequence> 
    <Custom Action="UnRegister" After="InstallInitialize">Installed AND NOT UPGRADINGPRODUCTCODE</Custom> 
</InstallExecuteSequence> 

問題是,當我嘗試卸載應用程序,文件首先,然後取出安裝程序在DLL中調用cleanup()函數。出錯後,卸載回滾並失敗。

如何配置WIX安裝程序,以便它首先調用函數,然後在卸載過程中刪除文件?

謝謝

+0

立即操作執行後文件被刪除,所以自定義操作應該在文件在機器上時運行。您能發佈卸載例程的詳細日誌,準確查看觸發文件刪除的內容嗎? –

+0

日誌: 錯誤1723.此Windows安裝程序包存在問題。無法運行此安裝所需的DLL。聯繫您的支持人員或軟件包供應商。操作註冊,條目:AddInfo,庫:C:\ Program Files(x86)\ testApp \ mydll.dll。 但是這個日誌顯示它想要執行我用於安裝的功能。 我有一個類似的CustomAction命名爲「Register」: Ali

+0

所以你的自定義動作運行了,但是失敗了?如果是這樣,這很可能是由於缺乏管理員權限,因此他們將自定義操作設置爲延期執行,而不是模擬,而不是立即執行。 –

回答

3

謝謝波格丹。根據日誌,問題在於安裝程序試圖執行只想在安裝時運行的CustomAction。爲此,我應該將「未安裝」添加到應該在安裝期間運行的自定義操作。像下面這樣:

<Custom Action="Register" Before="InstallFinalize">NOT Installed</Custom> 
+0

謝謝你,我正在尋找這樣的東西:) –

0

這更是一個評論,因爲你已經解決您的具體問題......

你應該分離出來,從應用程序庫安裝邏輯。您運行的任何自定義操作操作都應在未自行安裝的文件中實施。一個原因是這些文件可能會丟失,導致卸載失敗。

看來你正在使用某種自注冊機制。這是Windows Installer旨在避免的反模式。對於註冊表項,您可以使用WiX的註冊表項聲明來創建和刪除註冊表項。文件和文件夾也是由應用程序創建的。

但是,機器在卸載時擦乾淨是不合理的。應該刪除什麼以及應該留下什麼還有很多灰色區域。在一端是應用程序二進制文件(應該消失);另一端是用戶通過應用程序創建的文檔。可能由用戶親自選擇的設置在中間還有很多其他的東西(它們可以在重新安裝後保存以備將來使用)。