国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.Net中消除Dll中的dependency

2024-07-10 13:12:32
字體:
來源:轉載
供稿:網友
  • 網站運營seo文章大全
  • 提供全面的站長運營經驗及seo技術!
  •   我們在做.net class library項目時常常會遇到這樣的問題,我想生成一個dll供其它程序使用,但在我的項目里,又需要引用一些其它的reference,像activex控件或其它dll,而這些控件或dll又沒有strong name,不能寫入到gac(global assembly cache)中,因而,在注冊使用你的dll時,就必須帶上這些引用的控件或dll,才能完成注冊。然而,這并不是我們需要的,我們只想提供一個dll給人家用就行了,為什么還要帶上一堆的控件或dll呢?別人也不愿意這樣。那么,有什么辦法解決這個問題呢?
     

      大家都知道,在.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中的名字,這里不需要加任何路徑。

    發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 武隆县| 东丰县| 岳阳县| 和顺县| 乾安县| 和林格尔县| 百色市| 前郭尔| 东方市| 凤翔县| 临泽县| 青田县| 宜宾市| 江阴市| 老河口市| 皮山县| 鹤峰县| 镇康县| 茂名市| 名山县| 江口县| 偃师市| 怀柔区| 孝感市| 湖州市| 百色市| 香格里拉县| 北碚区| 砚山县| 陆川县| 界首市| 郧西县| 桂林市| 若羌县| 苗栗县| 神农架林区| 临江市| 临海市| 井冈山市| 黔西| 大连市|