2012-03-14 59 views
-1

我們使用InstallShield構建安裝了許多的同類產品相當,各自有停在我們的供應商目錄下的固定目錄的共享文件。我認爲安裝人員應該處理一個DLL地獄問題。如何使用InstallShield診斷/管理DLL地獄?

想象的產品A和B都有文件FOO,安裝在目錄D. FOO不一定是DLL;它可以是任何文件。

在一個理想的世界,FOO的兩個副本是相同的,當兩個產品安裝FOO得到(寫入)d,一切都很好。這就是它在一切都完全相同時的情況。

在實踐中,A和B可以是從不同的世代,因此實際上A具有FOO變體A(FOO_a)和B具有變體FOO_b。現在如果安裝了這兩種產品,則只有FOO_a或FOO_b中的一個將以D結尾,因此A或B中的一個會因爲錯誤的文件存在而被混淆。

我會從安裝程序(和InstallShield)預期的是,對系統上安裝的每個產品P,一個引用計數器將有關地方每個已安裝的文件保存(註冊表?)。因此,當被安裝A和FOO(_a)放置,FOO被標記爲屬於A,並且具有設置爲1的引用計數。如果B現在具有FOO_b相同FOO_a安裝,FOO應該被標記爲也屬於乙,並且引用計數遞增。如果安裝了B,並且FOO_b與FOO_a不同,我希望安裝程序抱怨安裝時提出了不兼容的文件FOO,並且安裝應該中止。當產品被卸載時,我希望每個已安裝文件的引用計數器遞減,並且只有當引用計數爲零時纔會刪除已安裝的文件。

這並不是什麼的InstallShield用來做。它只是在安裝過程中將FOO壓縮到目標目錄中。這實際上和DLL地獄一樣。這是安裝者的預期行爲嗎? InstallShield的? Windows的?

我們認爲我們尋找一種方式來問的InstallShield來管理這一點,但無法找到任何東西。我很高興有人告訴我們在哪裏可以正確配置。還是說InstallShield不能/不會這樣做? [如果是這樣,爲什麼我給他們錢?]

+1

您使用的是什麼項目類型,InstallScript,Windows Installer?這對於設定最佳實踐和預期行爲的討論至關重要。另外,我認爲指責InstallShield爲了賺錢而不是神奇地爲你工作是毫無意義的。這需要一些思考和努力才能正確地獲得這些東西。 (我可以用XML文件的假設來打動你的注意力。) – 2012-03-14 23:49:49

+0

我不是做這項工作的人,所以我將不得不在後面收集「你正在使用哪種類型」。我不是在指責InstallShield;注意IF。被問到的問題事實上假定有一種方法可以做到,我只是要求確認並提示我要在何處解釋InstallShield。 – 2012-03-15 00:47:38

+0

這就是包管理器存在的原因......愚蠢的Windows沒有提供一個 – alternative 2012-03-15 00:49:37

回答

1

如果你是真正的尋找一個解決方案,使用單獨的DLL。這是簡單可靠的,事實上它更容易談論(正如你在提及FOO_a和FOO_b時已經證明的那樣)。它還避免了錯誤消息,這對用戶無用。

的Windows確實對共享DLL引用計數方案,但它是按照慣例,所以這是不可靠的。如果你曾經有一個卸載程序問你是否真的想刪除一個共享組件,現在你知道爲什麼了。

+0

我在說的文件不是DLL。它們是我們產品預期/使用的各種文件,一些文本,一些HTML,一些二進制文件;引用計數也應該給他們。 ... Windows *有*,或*仍然有*它?僅適用於DLL或任意文件?我們控制我們的安裝程序(我認爲),除了我們之外,沒有人有理由在我們的目錄中安裝某些東西,所以如果我們使用相同的安裝程序並且它可以管理引用計數,則不再按慣例。 – 2012-03-15 00:28:46

+0

引用計數只是一個帶有計數器的註冊表項。沒有理由不能(並且不應該*)自己做同樣的事情。但是,恕我直言,你仍然會有更好的獨立空間,而不是試圖分享。通過共享,你將創建你自己的私有DLL的地獄。 – jdigital 2012-03-15 02:24:57

0

我相信你是在引用計數是如何工作的,如果你正在處理一個純基於MSI的安裝程序正確(這將有助於知道,如果A和B是基本MSI或InstallScript中的項目)。在任何情況下,我都會驗證A和B安裝項目中包含FOO的組件是否將其設置爲密鑰文件,並將共享屬性設置爲是。這應該會導致引用計數被正確管理。

關於在運行安裝程序將會發生什麼,它有一個共享文件的更新版本,據我所知,這主要取決於該文件是否有一個版本與否,無論它是一個較新的版本,等性能及其上次更改時間戳。如果您正在爲B中含有FOO_b是從FOO_a不同的安裝程序,我不知道的InstallShield如何能知道,這將打破A(我可能是錯的,也許它可以)。一種可能的解決方法是使用自定義操作來檢查FOO_b是否不同,如果是,請在安裝的早期製作現有的副本,然後在過程結束時將其複製回來。

+0

我們沒有Windows或InstallShield可能具有的任何形式的文件中的版本號;我們可以爲每個文件提供這樣的版本號給安裝程序,但我認爲「二進制文件映像不匹配」作爲不兼容性測試。 – 2012-03-15 00:44:30

1

沒有人可能開始回答你的問題,而不知道你使用的是什麼安裝技術。 InstallShield是支持許多不同框架的產品。

Windows只跟蹤DLL文件上的共享引用。 (SharedDllCount)。 Windows安裝程序(假設你甚至使用它)也跟蹤Compoent引用計數。

但是,應該指出(如果您正在使用Windows Installer),決定覆蓋文件的文件成本覈算過程確實與引用計數無關。引用計數在卸載時發揮作用。

假設你正在使用Windows安裝程序,來看看:

File Versioning Rules

也要看:

What happens if the component rules are broken?

這*是什麼Windows安裝程序和InstallShield知道如何處理它假定你正確地實施它。任何編程語言都可能被濫用和濫用。

2

如果FOO的變體版本適當且累積(這對於在共享位置上運行的所有安裝技術都是關鍵的),並且如果您的組件是共享的,則在兩個產品中共享相同的GUID(如果MSI)相同的安裝位置,那麼一切都將工作。由於條件清單的部分內容不真實,各種不好的事情可以而且會發生;一些有解決方法,有些是不可恢復的。

  • 如果安裝位置不同,很少或沒有這種事情,除非這兩款產品最終在某些其他原因相同的位置搜索。
  • 如果MSI和GUID不同(或者組件的內容不同),那麼您已經破壞了組件規則。這可能會導致文件不能在最終卸載時卸載,修復中的意外更改或其他難以預測的結果。
  • 如果文件版本不正確,則無法知道何時將其替換爲另一個文件。它可能會在一些訂購中,一個新的安裝將結束與舊版本運行。如果其他文件的版本正確增加,這可以在配套文件的MSI中緩解。
  • 如果該文件不是針對版本的累積,則該文件的新版本很可能會打破該文件的其他使用者。在這種情況下,您不應將其安裝到共享位置。

一個尺寸適合所有確實有時會有點混亂,所以通常問題空間被簡化爲一個可以解決的問題。在這種情況下,成本就是所有的安裝作者都需要遵循一些規則,如果他們想要定義良好的行爲。

1

如果你不想讓這些文件變得很常見,爲什麼你要把它們放在同一個目錄中?我寧願把他們放在不同的位置。現在假設你的FOO_a被許多程序在相同版本中使用,然後對於你的新程序需要的FOO_b和其他可能在以後添加的程序,添加另一個類似的公共目錄並使用代名稱或其他名稱命名它們。

+0

因爲實際上大多數情況下,文件*是*常見的,並且有很多,具有單獨的副本似乎毫無意義並且具有共享副本意味着如果您在共享目錄中看到一個副本,則知道這些目錄中的所有內容都是常見的。共享文件不同是很少見的。當他們沒有不同時,這些片段美麗地疊加在一起。當文件不一致(緩慢的演變)時,它可以安裝在單獨的目錄中。 – 2013-01-11 07:26:51