我從來沒有真正使用過合併模塊,所以我想我會有一個遊戲,看看他們是如何工作的。
合併模塊允許您將常用安裝程序功能打包到可重複使用的模塊(通常是安裝組件,但可能還有一些設置UI)中。使用此合併模塊的每個應用程序安裝程序都可以隨意安裝這些組件(例如,在他們的應用程序旁邊),並且如果他們確實安裝了這些組件的多個副本,但是如果他們受到嚴格管理並且全部指定了相同的安裝位置,則只會安裝一個組件的副本。
如果組件安裝到一個通用的位置,那麼情況會非常好,因爲只有卸載了所有從屬安裝程序後纔會卸載組件。這遠比爲公共組件安裝單獨的安裝程序簡單得多,因爲這意味着每個應用程序安裝程序都不必擔心卸載時是否應該卸載此常見安裝程序(這可能會破壞所有使用這些安裝程序的應用程序組件)。
約然而,這整個安排是版本的棘手的事情 - 如果應用一個安裝CommonLib V1.0,然後應用B安裝CommonLib V1.1,會發生什麼?
- 絕對應該安裝兩個版本的.Net程序集 - 這可以通過安裝到GAC或安裝到包含版本號的特定目錄來解決。
- 也許應該安裝本機dll的兩個版本。再次,這可以通過安裝到WinSxS或安裝到版本名稱的目錄來解決。
- 我猜應該只安裝一個數據副本,但如果情況並非如此,那麼您將需要將數據安裝到不同的目錄。
如果多個目錄用於不同版本,那麼你應該確保它是決定這些目錄的名稱合併模塊,例如你的公共庫的目錄結構可能是這樣的:
Program Files
Common Lib // This is the folder that installers must specify
*Common data files*
v1.0
*v1.0 Files*
v1.1
*v1.1 Files*
即使應用程序在安裝v1.1的同時意外地保持公用安裝目錄不變,也不會覆蓋v1.0文件。 (請注意,可能還有其他更復雜的方式讓合併模塊指定安裝位置,但我知道上面的工作原理,所以我沒有太多地關注它,因爲它可能取決於您使用的是什麼創建你的MSI-Wix/InstallShield等)
另外,如果你將你的版本分成不同的目錄,你還需要一些機制來允許你的庫或最終用戶應用程序識別相關文件的位置(例如註冊表項) - 這是安裝到GAC的位置(或者可能只是將應用程序託管庫安裝在應用程序旁邊)具有其優勢,因爲這意味着此邏輯可以嵌入到庫本身中。
最終你是如何做到這一點將取決於你的具體要求,但我希望這至少給你一些想法。
如果你的安裝程序是基於MSI的,那麼你應該看看[合併模塊](http://msdn.microsoft.com/en-us/library/aa369820%28v=vs.85%29.aspx) - 它聽起來像非常像您應該將常用組件打包到合併模塊以供其他安裝程序使用。 – Justin 2011-04-08 07:40:33