2011-04-08 21 views
1

我目前正在一個項目中,將被少數其他項目使用。該項目包含:處理安裝程序中常見文件的常見/最佳方式是什麼?

  • 一些本地的dll
  • 一些管理的DLL的P/Invoke爲本地的人
  • 數據 - 可能是相當大的

我想爲這個項目提供單獨的安裝程序其他項目會檢測它是否已安裝並在可用的情況下使用它。

什麼是最好的處理方法?

我已經考慮:

  1. 創建只有數據安裝程序,並擁有所有其他項目的分配我的dll自己
  2. 創造一切的安裝程序,並有其他項目找到我的dll文件並加載它們。

我有#2的技術難度,其他項目如何使用我的dll?我寧願避免反思。如果我使用dll,我的受管dll如何找到本機dll?

編輯: 我不尋找特定的包裝器/安裝程序具有特定的功能。我只是問在概念上什麼是最佳做法。作爲Kragen提到的

+2

如果你的安裝程序是基於MSI的,那麼你應該看看[合併模塊](http://msdn.microsoft.com/en-us/library/aa369820%28v=vs.85%29.aspx) - 它聽起來像非常像您應該將常用組件打包到合併模塊以供其他安裝程序使用。 – Justin 2011-04-08 07:40:33

回答

1

我從來沒有真正使用過合併模塊,所以我想我會有一個遊戲,看看他們是如何工作的。

合併模塊允許您將常用安裝程序功能打包到可重複使用的模塊(通常是安裝組件,但可能還有一些設置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的位置(或者可能只是將應用程序託管庫安裝在應用程序旁邊)具有其優勢,因爲這意味着此邏輯可以嵌入到庫本身中。

最終你是如何做到這一點將取決於你的具體要求,但我希望這至少給你一些想法。

+0

感謝您對此的意見。 – Kugel 2011-04-09 21:32:58

-1

,看看微星包裝過程。我們使用AdminStudio這非常適合打包二進制文件。或者你也可以WIX(這是命令行包裝通常與構建集成)

+0

-1你還讀過這個問題嗎?我不是在尋找能夠壓縮我的文件的東西。 – Kugel 2011-04-08 09:49:51

+0

我做過了,用「安裝程序」這個詞繼續:) GAC可以作爲一種選擇,當你釋放新的二進制文件時,那些仍然可以共享的舊文件將繼續工作。爲了共享數據,您必須以某種方式打包並分發它 – 2011-04-08 09:53:55

相關問題