.Net中消除Dll中的dependency_.Net教程
推薦:ASP.NET--制作功能完善的安裝程序 象 ASP、ASP.NET 等諸多基于 Web 的應(yīng)用程序的安裝與部署一直是個(gè)麻煩事情,一般都是手工復(fù)制、手工修改相關(guān)配置文件(主要是數(shù)據(jù)庫配置),和 Windows 上 Installer 或 Linux 上的 RPM 相
我們?cè)谧?Net Class Library項(xiàng)目時(shí)常常會(huì)遇到這樣的問題,我想生成一個(gè)dll供其它程序使用,但在我的項(xiàng)目里,又需要引用一些其它的reference,像ActiveX控件或其它dll,而這些控件或dll又沒有strong name,不能寫入到GAC(Global Assembly Cache)中,因而,在注冊(cè)使用你的dll時(shí),就必須帶上這些引用的控件或dll,才能完成注冊(cè)。然而,這并不是我們需要的,我們只想提供一個(gè)dll給人家用就行了,為什么還要帶上一堆的控件或dll呢?別人也不愿意這樣。那么,有什么辦法解決這個(gè)問題呢?
大家都知道,在.Net中,如果你試圖將一個(gè)dll寫入到GAC中,那么除了你的dll項(xiàng)目要使用strong name以外,你的項(xiàng)目中用到的其它的控件或dll都需要有strong name,否則,當(dāng)你注冊(cè)你的dll時(shí),會(huì)提示缺少dependency。這一點(diǎn)讓人很煩,但應(yīng)該有它的好處,利于版本控制。既然是這樣,我們只有將引用到的控件或dll都加上strong name,并寫入到GAC中,這樣在注冊(cè)你的dll時(shí),就會(huì)到GAC中去找它所用到的控件或dll了。那么,如何做呢?大致分兩步:
1、給需要引用的控件或dll加strong name
這是必須要做的,否則你無法把他們寫到GAC中。.Net的SDK提供一個(gè)給程序集生成強(qiáng)名的工具,其實(shí)不只是生成,還有管理及簽名的驗(yàn)證等,只是根據(jù)不同的option來的。詳細(xì)說明請(qǐng)參考MSDN。下面是通過sn創(chuàng)建一個(gè)key pair,存儲(chǔ)在keyfile.snk中:
sn -k keyfile.snk
這樣就生成了一個(gè)密鑰對(duì)。如果你的項(xiàng)目中沒有引用其它的不帶強(qiáng)名的控件或dll的話,只是想把自己的dll寫入GAC,那么在你項(xiàng)目的AssemblyInfo.cs中,把AssemblyKeyFile加上,就是你剛才生成的keyfile.snk文件。
[assembly: AssemblyKeyFile("..\\..\\keyfile.snk")]
這里的路徑是指編譯后項(xiàng)目輸出的相對(duì)路徑,所以,如果這里寫成這樣的話(當(dāng)然你也可以修改),就應(yīng)該把剛才生成的keyfile.snk拷貝到項(xiàng)目的跟目錄下,以確保在編譯的時(shí)候能找到snk文件。這樣,編譯后的dll就可以寫到GAC中了:
gacutil -i yourdll.dll
如果你的項(xiàng)目中引用了其它的不帶有強(qiáng)名的控件或dll的話,就需要再做下一步。
2、給不帶有強(qiáng)名的控件或dll加上強(qiáng)名
這里要用到兩個(gè)工具,也是.Net自帶的,tlbimp和aximp。tlbimp是將COM類型庫中的類型定義轉(zhuǎn)換為CLR程序集的等效定義,aximp是將COM類型庫中的類型定義轉(zhuǎn)換為windows窗體控件,詳細(xì)說明請(qǐng)參考MSDN。
假設(shè)你要給tom.dll和MSFlxGrd.ocx加上強(qiáng)名:
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是根據(jù)第一步產(chǎn)生的,每一個(gè)dll都要對(duì)應(yīng)一個(gè)snk。tom.dll為轉(zhuǎn)換過的dll的名字,沒有什么其它含義。另外需要說明的是MSFlxGrd.ocx會(huì)產(chǎn)生兩個(gè)dll,分別是MSFlexGridLib.dll和AxMSFlexGridLib.dll。個(gè)人理解為在窗體初始化時(shí)會(huì)產(chǎn)生一個(gè)AxMSFlexGridLib,不知誰有更好的解釋?
這樣就把tom.dll和MSFlxGrd.ocx控件加上了強(qiáng)名稱并轉(zhuǎn)換為相應(yīng)的dll了,再把它們寫入到GAC中:
gacutil -i tom.dll
gacutil -i MSFlexGridLib.dll
gacutil -i AxMSFlexGridLib.dll
剩下的工作就是將它們重新引用到你的項(xiàng)目中,重新編譯,這樣生成的dll在注冊(cè)時(shí)就不需要任何dependency了,因?yàn)樗鼈円呀?jīng)在GAC中了,打開c:\winnt\assembly即可看到。
如果要將它們從GAC中刪除,則:
gacutil -u tom
gacutil -u MSFlexGrid
gacutil -u AxMSFlexGrid
tom、MSFlexGrid和AxMSFlexGrid為GAC中的名字,這里不需要加任何路徑。
分享:解析.Net框架下的XML編程技術(shù) XML是微軟。Net戰(zhàn)略的一個(gè)重要組成部分,而且它可謂是XML Web服務(wù)的基石,所以掌握。Net框架下的XML技術(shù)自然顯得非常重要了。本文將指導(dǎo)大家如何運(yùn)用C#語言完成。Net框架下的XML文檔的讀寫
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過程實(shí)現(xiàn)分頁示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- 解讀如何在.NET中訪問MySQL數(shù)據(jù)庫
- VS 2008和.NET 3.5 Beta2新特性介紹
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- 解讀在Visual C# .NET中跟蹤和調(diào)試
- 關(guān)于WPF使用MultiConverter控制Button狀態(tài)的詳細(xì)介紹
- 怎樣用Asp.net代碼在虛擬主機(jī)實(shí)現(xiàn)Urlrewrite
- asp.net+js實(shí)現(xiàn)網(wǎng)頁打印
- 解析.net如何用OleDb方式操作excel
- CheckBoxList兩列并排編譯為表格顯示具體實(shí)現(xiàn)
- 解讀ASP.NET刷新頁面的六種方法
- 相關(guān)鏈接:
- 教程說明:
.Net教程-.Net中消除Dll中的dependency
。