.net 註冊引用的dll

我們在做.Net Class Library項目時常常會遇到這樣的問題,我想生成一個dll供其它程序使用,但在我的項目裏,又需要引用一些其它的reference,像ActiveX控件或其它dll,而這些控件或dll又沒有strong name,不能寫入到GAC(Global Assembly Cache)中,因而,在註冊使用你的dll時,就必須帶上這些引用的控件或dll,才能完成註冊。然而,這並不是我們需要的,我們只想提供一個dll給人家用就行了,爲什麼還要帶上一堆的控件或dll呢?別人也不願意這樣。那麼,有什麼辦法解決這個問題呢?

  正好現在做的這個項目就是這種情況,看了一下網上的資料也不多,於是將自己的解決方法share一下,有什麼不好的地方,懇請指正。

  大家都知道,在.Net中,如果你試圖將一個dll寫入到GAC中,那麼除了你的dll項目要使用strong name以外,你的項目中用到的其它的控件或dll都需要有strong name,否則,當你註冊你的dll時,會提示缺少dependency。這一點讓人很煩,但應該有它的好處,利於版本控制。既然是這樣,我們只有將引用到的控件或dll都加上strong name,並寫入到GAC中,這樣在註冊你的dll時,就會到GAC中去找它所用到的控件或dll了。那麼,如何做呢?大致分兩步:

  1、給需要引用的控件或dll加strong name

  這是必須要做的,否則你無法把他們寫到GAC中。.Net的SDK提供一個給程序集生成強名的工具,其實不只是生成,還有管理及簽名的驗證等,只是根據不同的option來的。詳細說明請參考MSDN。下面是通過sn創建一個key pair,存儲在keyfile.snk中:

sn -k keyfile.snk


  這樣就生成了一個密鑰對。如果你的項目中沒有引用其它的不帶強名的控件或dll的話,只是想把自己的dll寫入GAC,那麼在你項目的AssemblyInfo.cs中,把AssemblyKeyFile加上,就是你剛纔生成的keyfile.snk文件。

[assembly: AssemblyKeyFile("..//..//keyfile.snk")]


  這裏的路徑是指編譯後項目輸出的相對路徑,所以,如果這裏寫成這樣的話(當然你也可以修改),就應該把剛纔生成的keyfile.snk拷貝到項目的跟目錄下,以確保在編譯的時候能找到snk文件。這樣,編譯後的dll就可以寫到GAC中了:

gacutil -i yourdll.dll


  如果你的項目中引用了其它的不帶有強名的控件或dll的話,就需要再做下一步。

  2、給不帶有強名的控件或dll加上強名

  這裏要用到兩個工具,也是.Net自帶的,tlbimp和aximp。tlbimp是將COM類型庫中的類型定義轉換爲CLR程序集的等效定義,aximp是將COM類型庫中的類型定義轉換爲windows窗體控件,詳細說明請參考MSDN。
  假設你要給tom.dll和MSFlxGrd.ocx加上強名:
  

tlbimp tom.dll keyfile:tom.dll.snk out:tom.dll

aximp MSFlxGrd.ocx keyfile:MSFlxGrd.ocx.snk AxMSFlxGrd.ocx.snk


  這裏,tom.dll.snk、MSFLlxGrd.ocx.snk和AxMsFlxGrd.ocx.snk是根據第一步產生的,每一個dll都要對應一個snk。tom.dll爲轉換過的dll的名字,沒有什麼其它含義。另外需要說明的是MSFlxGrd.ocx會產生兩個dll,分別是MSFlexGridLib.dll和AxMSFlexGridLib.dll。個人理解爲在窗體初始化時會產生一個AxMSFlexGridLib,不知誰有更好的解釋?

  這樣就把tom.dll和MSFlxGrd.ocx控件加上了強名稱並轉換爲相應的dll了,再把它們寫入到GAC中:

gacutil -i tom.dll
gacutil 
-i MSFlexGridLib.dll
gacutil 
-i AxMSFlexGridLib.dll


  剩下的工作就是將它們重新引用到你的項目中,重新編譯,這樣生成的dll在註冊時就不需要任何dependency了,因爲它們已經在GAC中了,打開c:/winnt/assembly即可看到。

  如果要將它們從GAC中刪除,則:

gacutil -u tom
gacutil 
-u MSFlexGrid
gacutil 
-u AxMSFlexGrid

  tom、MSFlexGrid和AxMSFlexGrid爲GAC中的名字,這裏不需要加任何路徑
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章