簡體   English   中英

Wix安裝程序在卸載時不會刪除文件

[英]Wix installer is not removing files when uninstalling

當我發現某些功能不再起作用時,我正在為設置添加新功能。

我有一個可選功能,該功能由組件組成,例如,在應用程序的文件夾中安裝了Activex,在另一個文件夾中安裝了各種dll,但是在卸載Activex時,應用程序的文件夾中只有一個文件,並且過濾器也保留在其單獨的文件夾中。

這曾經可以很好地卸載ActiveX和dll,並在卸載結束時刪除了這兩個文件夾。

我已經花了數小時來重命名ActiveX的所有GUID(重新生成帶有熱量的.wxs文件)和所有dll(如類似文章中所建議的那樣),但無濟於事!

我只是不明白,我的應用程序被刪除了,我的Windows服務被停止並刪除了,等等。。。但是activex和這些dll不會被刪除!

我注意到有問題的文件將其操作設置為null。 首先在功能部分中,將activex和dll鏈接的一個為null,而其他兩個都可以!

MSI (s) (C4:C0) [04:01:07:040]: Doing action: InstallValidate
MSI (s) (C4:C0) [04:01:07:040]: Note: 1: 2205 2:  3: ActionText 
Action ended 04:01:07: KillAgentMonitor. Return value 1.
Action start 04:01:07: InstallValidate.
MSI (s) (C4:C0) [04:01:07:040]: PROPERTY CHANGE: Deleting 
MsiRestartManagerSessionKey property. Its current value
is '86b17c5ff2f8de4d9424198f445cc8d1'.

MSI (s) (C4:C0) [04:01:07:040]: Feature: Feature2; Installed: Absent;
Request: Null;   Action: Null

MSI (s) (C4:C0) [04:01:07:040]: Feature: Feature3; Installed: Local;
Request: Absent;   Action: Absent

MSI (s) (C4:C0) [04:01:07:040]: Feature: Feature1; Installed:
Local;   Request: Absent;   Action: Absent

然后刪除的文件:

MSI (s) (C4:C0) [04:01:07:040]: Component: CMP_File1;
Installed: Local;   Request: Absent;   Action: Absent

MSI (s) (C4:C0) [04:01:07:040]: Component: CMP_File2; 
Installed: Local;   Request: Absent;   Action: Absent

然后是dll文件:

MSI (s) (C4:C0) [04:01:07:056]: Component: CMP_File53_DLL; Installed: 
Local;   Request: Null;   Action: Null

MSI (s) (C4:C0) [04:01:07:056]: Component: CMP_File54_DLL; Installed:
Local;   Request: Null;   Action: Null

MSI (s) (C4:C0) [04:01:07:056]: Component: CMP_File55_DLL; Installed: 
Local;   Request: Null;   Action: Null

如您所見,動作全部為空?

最后是activex:

MSI (s) (C4:C0) [04:01:07:056]: Component: CMP_MyActiveX_DLL; Installed: 
Local;   Request: Null;   Action: Null

還空!!

我的activex安裝在c:\\ program files(x86)\\ mycompany \\ client中,而dlls安裝在c:\\ windows \\

我還在某些文章上讀到過,可能出現此問題的原因之一是組件可能在注冊表中留下了信息,但我檢查了許多特定的隨機GUID,但找不到。

在另一篇文章中提到,這可能是由於dll的引用計數所致,可能是因為這些是SharedDlls注冊表,但事實並非如此。 我已經檢查過,注冊表中什么也沒有。

我還擦除了我的虛擬機,並重建了一個新的虛擬機,但是還是不好。

我完全不知道下一步該怎么做。 關於這些動作為何無效的任何其他建議?

我應該在日志中尋找特定內容嗎?

謝謝。

更新

我最終弄清楚了導致此問題的原因。 它與任何建議的問題都沒有關系,例如無效的GUID,更高的版本,引用計數,在Windows文件夾中等等。

如果提供了命令行參數(即INCLUDEFILTERS = 1),則我的一項功能僅顯示在功能樹視圖中,因為默認情況下不會將這些功能提供給所有客戶端。

代碼是:

<Feature Id="Feature2" Title="Filters" Level="10" Description="Select 
this option to install optional filters" TypicalDefault="install"
InstallDefault="local">
  <ComponentGroupRef Id="Feature2Components"/>
    <!--<Condition Level="0">
      <![CDATA[(INCLUDEFILTERS = 0)]]>
    </Condition>-->
</Feature>

默認情況下,除非通過命令行提供且設置為1,否則INCLUDEFILTERS為0。

現在問題似乎與此有關。 當我進行測試時,我通過了INCLUDEFILTERS = 1來安裝我的activex和filter,但是我猜想當您調用卸載時,它不知道該值,而是使用默認值即0,因此不執行任何操作。

基於以上內容,我必須假設在卸載時以某種方式查看功能樹,並檢查是否選擇了該功能樹。

是否可以在安裝時檢測到INCLUDEFILTERS設置為1,並在卸載時將內部變量重置為1? 我應該在CDATA中使用“已安裝”還是有另一種方法來實現此目的?

老實說,我什至不知道知道該值是否會有所作為,但現在我假設會有所作為。

我將繼續嘗試CDATA中的“已安裝”條件,然后我將更新我的答案。

謝謝。

確實,這與我反對此特定功能的條件有關。 如前所述,在安裝時,我提供了一個命令行參數來包含ActiveX和篩選器。 卸載時,它不會檢測到在安裝時已傳遞了此參數,因此,為解決此問題,我僅添加了另一個條件:

  <Feature Id="Feature2" Title="Filters" Level="10" Description="Select 
   this option to install optional filters" TypicalDefault="install"
   InstallDefault="local">
    <ComponentGroupRef Id="Feature2Components"/>
      <Condition Level="0">
        <![CDATA[(INCLUDEFILTERS = 0)]]>
      </Condition>
     <Condition Level="10">
      <![CDATA[(INCLUDEFILTERS = 1 OR (Installed AND NOT
                UPGRADINGPRODUCTCODE))]]>
     </Condition>
  </Feature>

可惜花了幾個小時才弄清楚這么簡單的代碼行!! 希望這會有所幫助!

在日志中搜索每個無效操作組件的GUID。 Windows記錄離開組件的原因。 Windows和Windows系統目錄中安裝的文件通常是永久性的,以減輕DLL的麻煩 您可以在WiX創作中或Orca中的.msi的組件表中檢查永久性組件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM