2009-10-14 29 views
5

我已將基於WiX的安裝程序混淆在多臺服務器上,以便在卸載過程中不再刪除文件或組件(或甚至其他功能)。 MSI日誌顯示所有不會卸載的組件上的PreviouslyPinned = 1。刪除與WiX一起安裝的GUID =「」組件

我不喜歡使用SharedDll計數甚至不同安裝程序之間的共享組件。

我想我已經追蹤到我的WiX代碼的特定版本。我做了幾件愚蠢的事情。我(無意)創建的非託管組件用空的Guid

<Component Id="file.ext" Guid=""> 
    <File .../> 
<Component> 

,我也改變了其他組件的文件位置和Id(但不包括它的GUID)。先前版本中的所有組件顯示BeforelyPinned = 1,並且不會卸載,並且在此版本之後添加的新組件正確安裝/卸載。

如何讓我的安裝程序恢復正常並刪除以前固定的組件?

回答

5

Windows Installer實際上支持空白GUID的概念。它表示「安裝,但不註冊組件」:http://msdn.microsoft.com/en-us/library/aa368007(VS.85).aspx(ComponentId條目解釋了空GUID發生的情況)。

我剛剛使用WIX進行了測試,它似乎尊重空白的GUID條目(即,沒有guid是自動生成的)。記住1:/ 絕對路徑之間1規則的關鍵路徑GUID

  • 如果更改了GUID,一個新的絕對路徑應該用於組件的關鍵路徑。
  • 如果更改絕對路徑(例如,通過重命名文件或移動它),則應該更改GUID。

總之,GUID引用 - 計數組件的安裝密鑰路徑,而不是文件 - 可能會移動,但是文件通過新的GUID具有新的身份(想象中的兩個同名的文件不同的文件夾 - 它們是不同的文件,不同的身份)。

清理乾淨的GUID引用計數可能有點混亂。我發現如果我可以更改文件名稱來有效地解決問題。我也產生了一個新的GUID,因此打破了老GUID的參考數量。您也可以重命名安裝文件夾(理想情況下,這意味着所有組件GUID也應該更改)。 RemoveFile表概念可用於刪除尚未註冊爲組件(例如生成的文件)的安裝和/或卸載文件。

+0

我聽到你說的是,因爲一個空白的GUID甚至沒有註冊一個組件,它應該對其他組件沒有影響。是對的嗎? – 2009-10-14 18:03:43

+0

是的,一般來說,空白的GUID應該對其他組件沒有影響,因爲MSI在安裝文件後忽略它。但是,很少有一個事實沒有修改:由空白GUID安裝的文件將不會被卸載。如果這是一個版本化文件,並且在添加一個guid之前不更改安裝位置,理論上可能現有文件可能會阻止安裝新文件版本(如果現有文件是較高版本)。如果您使用次要升級,還有一些其他不太可能的情況,但如果您不使用它,我不會進入它。 – 2009-10-14 19:13:27

+0

感謝您的詳細解答!最後,讓其他所有東西能夠正確解除(從MSI日誌中刪除PreviouslyPinned = 1引用),我必須進入該PC上的註冊表,並從 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UserData \ \ Components基於我在這裏發現的提示http://blogs.msdn.com/icumove/archive/2008/06/17/windows-installer-error-2908-with-sub-errors- 1402-and-1450.aspx – 2009-10-16 08:21:10

0

更改組件的ID並使用有效的GUID應該是正確的。

+0

我希望通過「使事情正確」,你的意思是允許所有BeforelyPinned = 1組件卸載。當我改變這個時沒有發生。 – 2009-10-16 08:05:03

+0

這個答案在這方面沒有意義。使用帶有GUID的組件是正常的方式,但這裏主題是沒有GUID的組件。 – Philm 2013-08-20 09:10:29

0

簡短的回答是:

是,使用MSI組件沒有GUID的是怎樣的一個批覆制方法。複製並忘記。 當然,您必須添加一件事:在每次卸載或卸載之前刪除所有文件(條件爲「重新安裝或修補或刪除」)或主要升級。沒有這一點,它並沒有什麼意義。 即使使用CMD.exe/c RD/S/Q ...,您也可以在自定義操作中執行此操作。(當然,自定義代碼比這更優雅)

如果你做得對,你可以設置一個非常簡單的設置,而不需要所有的陷阱,MSI通常都有。 當然,如果遞歸刪除一個文件的整個目錄,它會更容易。

還沒有試過,但我會:沒有GUID和普通組件的「動態」組件,然後提供補丁。從理論上講,這應該可以起作用,並且這對於許多修補程序之間高度變化的文件集導致的修補問題將是一個很好的解決方法。

0

1. 事實上,沒有GUID的組件是真正的「動態文件鏈接」方法,通常被幾個工具或人員錯誤地稱讚。

其他「方式」: 2.生成的GUID自動僅僅是一個自動化步驟(但每一個好設定的基礎設施建設:-) 在我眼裏,這不是動態的,因爲如果你把它動態的過程部分,你做錯了:

2a。生成每次完全隨機的GUID =>錯誤的算法

2b。僅在創建組件時第一次生成GUID,並對新資源進行智能「差異」識別以包裝在新組件中。 =>唯一的工作文件樹同步方法。但你可以在這裏做很多錯... 這是專家。