2009-09-24 115 views
0

我有一個Wix安裝程序,安裝並刪除罰款,如果我不執行我的自定義操作。但是,如果我確實執行了它們,那麼我的自定義操作就會完成它的工作,並且卸載成功,但是所有安裝的文件仍保留在程序文件應用程序目錄中。Wix不會刪除它的文件,如果我刪除我的

安裝時,我的自定義操作(After =「InstallFiles」)從Zip中將多個文件提取到主安裝目錄下的目錄中。我還捕獲所有提取(添加)文件的列表。這工作完美。

在卸載時,我的自定義操作(After =「MsiUnpublishAssemblies」)遍歷列表並刪除添加的文件,添加的子目錄和文件列表本身。這工作正常 - 我添加的文件被刪除。但是即使安裝程序執行了所有步驟(只要我可以告訴日誌文件)並且成功結束,安裝程序最初安裝的主要文件仍然存在。

任何想法在這裏都會有很大的幫助。

謝謝!

更新: 我已經嘗試性地解決了這種蠻力的方式,但我仍然想要一個真正的答案。這是我的暴力代碼。我用我的InstallDir的DirectoryInfo調用它。

private static void CleanupTheRest(DirectoryInfo dirInfo) 
    { 
     // until I figure out why the unistall won't remove these after executing my CA 
     foreach (var subDirInfo in dirInfo.GetDirectories()) 
     { 
      CleanupTheRest(subDirInfo); 
     } 
     foreach (var file in dirInfo.GetFiles()) 
     { 
      file.Delete(); 
     } 
     dirInfo.Delete(); 
    } 

回答

0

你用來從嵌入式壓縮文件中提取文件的方法並不是我將放入我的MSI。相反,我會讓應用程序在啓動時提取壓縮文件 - 更加可控和可靠。實際上我不會推薦任何解壓縮,但有時它對於數據文件是必要的。

你是怎麼安排你的刪除操作的?立即/延期?你使用同步或異步運行模式?如果您註釋掉您的卸載自定義操作,卸載工作?如果您啓用了「legacy shareddll ref-count」功能,則可能會在註冊表中刪除引用計數:HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ SharedDLLs(如果這樣刪除條目並再試一次 - 這可能會導致卸載按預期工作)。

+0

我們有多個功能,每個功能都需要從大量數據文件的副本開始。我試圖不把這個集合多次放入安裝程序。解壓縮非常適合安裝功能。要回答你的問題: *'立即',MsiUnpublishAssemblies後 *同步(檢查) *沒有「刪除」CA的卸載工程,但留下的解壓縮文件 *我沒有啓用「遺留shareddll參考計數「功能 也許我可以嘗試爲每個功能生成一個」RemoveFile「元素的片段組件。 感謝您的回覆! – 2009-09-26 15:24:33

1

提取ZIP真的不是解決問題的最佳方式,不過您只需使用RemoveFile元素讓Windows Installer在卸載過程中刪除文件。