2012-02-29 94 views
0

我有應用程序A和B,它們都使用共享組件S.如果S是一個DLL程序集,我只需將它的一個副本作爲私有部件。但S是一個EXE,A和B通過一個協議與它交談。當A和B都在運行,他們必須說話的S.可能出現的情況相同的實例:部署EXE在多個應用程序之間共享的最佳方式

  1. 用戶安裝A和S與它一起安裝,因爲A依賴於S.後來的用戶安裝B,但S沒有安裝,因爲它已經在那裏。
  2. 用戶安裝A和S與它一起安裝。後來用戶安裝了B,它隨S的更新版本一起被替換爲新版本。
  3. 安裝了A和B(和S)。用戶卸載B,但由於A仍然存在,所以S被保留。後來用戶卸載A和S也被卸載,因爲沒有應用程序依賴它了。

S的新版本將與舊版本的A和B兼容。如果協議改變,S將支持舊協議和新協議等。

這種情況下最好的部署策略是什麼?我正在使用Windows Installer(MSI)。將S作爲獨立應用程序與單獨的MSI並從其他MSI調用MSI似乎是件好事,但也許有更好的方法。也許MSM?..我想保持安裝簡單。預先感謝您的答案。

回答

0

MSI使用引用計數來處理您的確切場景。應爲唯一項目(位置和二進制文件)分配一個組件GUID,然後讓該組件GUID跨MSI共享。如果您通過編譯爲兩個MSI的通用片段使用WiX(A & B),則可以輕鬆完成此操作。然後,當您安裝A & B時,無論順序如何,S的引用計數都會增加,因此如果另一個安裝了該引用,則卸載該引用將不會刪除該exe。

關鍵是要確保兩個MSI使用相同的組件GUID並將S安裝到同一位置。

編輯 - 添加在組件裁判的URL從MSDN

計數

http://msdn.microsoft.com/en-us/library/windows/desktop/aa368007(v=vs.85).aspx

注意,屬性稱爲msidbComponentAttributesSharedDllRefCount但它應該爲您的方案,我相信工作。

+0

尼克,感謝您指向我的WiX。你提出的解決方案看起來很有希望,但是在MSM中使用S並通過共同碎片合併它會更好嗎?這將確保A和B的GUID和S的路徑相同。您的意見是什麼? – Yuriy 2012-03-01 12:45:00

+0

此外我搜索了msidbComponentAttributesSharedDllRefCount,發現這個http://blogs.msdn.com/b/astebner/archive/2005/08/30/458295.aspx。在「2005年9月1日2:30 AM」的評論中,Aaron Stebner說:「Windows安裝程序還爲系統上安裝的所有組件的組件ID保留一個內部參考計數,無論它是否安裝這些文件中包含的文件組件,並且不管MSI組件表中的組件屬性設置是什麼。「,所以也許我不需要設置msidbComponentAttributesSharedDllRefCount? – Yuriy 2012-03-01 12:45:13

+0

爲了回答您的問題,我認爲a)是的,MSM在這種情況下適用於可移植性和重用,b)文章的確似乎表明您不需要設置屬性。 – 2012-03-01 16:42:36

相關問題