日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

浅析.Net共享程序集编程

發布時間:2023/11/27 生活经验 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅析.Net共享程序集编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作者:宋華?? 賽迪網
Net結構里的程序集Assembly是自我描述的安裝單元,它在應用程序域(AppDomain)中運行。您必須首先將程序集加載到應用程序域中,然后才能運行該應用程序,并且,同一程序集可以加載到多個應用程序域中,根據這些應用程序域對該程序集代碼使用方式的不同產生了程序集的分類:私有程序集和共享程序集。

1、私有程序集

我們通常用到的就是私有程序集。這種情況下,我們創建本地應用程序項目(或組件),編譯后就生成dll或exe類型的私有程序程序集。當我們在其他客戶應用程序中使用這類程序集時,只需要添加引用。當這樣的程序集被多個應用程序域使用時,每個應用程序域需要復制該程序集,進程中也將存在該程序集的多個副本。

2、共享程序集

與私有程序集相對的是共享程序集(Shared Assembly),它提供多個應用程序域訪問同一個程序集的能力,特別地,內存中只存在該程序集的同一份副本,這種非特定于域的代碼共享極大節省了內存資源占用。并且,在大多數情況下,共享程序集安裝在全局程序集高速緩沖存儲器(Global Assembly Cache)中而不存在于應用程序相關目錄下,對它的引用不會產生文件復制,自然也不會產生額外的副本。因而,共享程序集不能簡單通過XCOPY命令實現部署,而應使用MSI(Microsoft Windows Installer)進行。當組件和主應用程序不由同一個開發商建立,或者一個大應用程序分布在幾個小工程中時,常常需要使用共享程序集。

創建名稱唯一的共享程序集


與私有程序集不同,使用共享程序集時要遵循許多規則。特別地,共享程序集必須有一個唯一的名稱(稱為強名StrongName)。這個名稱被要求必須是全局唯一的,并且應該能夠保護該名稱,其他人不能再使用它創建同名程序集。一般地,我們通過嵌套命名空間層次結構來滿足這一要求。結合公司名稱、項目類別(類似文件夾分類)等命名項目類等對象,可以在一定程度上避免程序集重名。而配合使用公共/私有密鑰機制,則可以徹底保證名稱的唯一性。(關于密鑰機制請參見專門的文章),下面簡要說明強名稱工具Sn.exe在這方面的應用:

生成公共/私有密鑰對文件

.Net結構中的強名稱工具Sn.exe有助于使用強名稱對程序集進行簽名,而通過簽名具有強名稱的程序集,就可以確保名稱的全局唯一性。Sn.exe工具提供用于密鑰管理、簽名生成和簽名驗證的選項。其重要的一個應用是生成一個新的密鑰對并將其寫入指定的文件。引用這個密鑰對文件的共享程序集將能夠保證唯一的名稱。

下面的命令行語句創建一個新的隨機密鑰對并將其存儲在 myKey.snk 文件中。

sn -k myKey.snk

(Sn.exe還有很多參數,請參見Microsoft技術支持)

修改屬性為程序集應用強名稱

下一步,使用程序集屬性將強名稱信息引入代碼中。屬性AssemblyKeyFileAttribute指定包含用于生成共享名稱的密鑰對的文件名稱,這個屬性位于AssemblyInfo.cs文件中,該文件在使用Visual Studio.Net SDK創建項目時自動生成,用于保存程序集配置等信息。

在代碼模塊中,添加AssemblyKeyFileAttribute屬性的同時指定在使用強名稱為程序集簽名時要用到的密鑰對文件的名稱及路徑。下面的代碼示例當前程序集與名為myKey.snk 的密鑰文件一起使用:

[assembly:AssemblyKeyFileAttribute(@"../myKey.snk")](修改mykey.snk文件為正確的路徑),這之后,如果使用Idasm工具查看該程序集,其清單中將包含一個公共密鑰(私有密鑰將不會保存在程序集清單中,這可以確保程序集不被非法修改)。

在全局程序集高速緩沖存儲器GAC(Global Assembly Cache)中安裝共享程序集


在我們使用Dll類型的私有程序集時,需要添加該程序集引用。而當私有程序集是exe類型時,還需要將它顯式復制到當前應用程序的可執行目錄(通常是當前工程的/Bin/Debug目錄)中。其實,對DLL類型私有程序集的引用實質上也隱式進行了復制。添加應用后,在當前應用程序可執行目錄或其子目錄下,你就能夠找到被引用的程序集文件(其實正是因為這樣的特性,私有程序集安裝很簡單,只需復制改程序集中的所有文件,一個xcopy命令就足夠了,這就是0壓縮安裝)。

與此類似,使用共享程序集也需要添加引用。不同的是,引用共享程序集不產生復制,而是在使用共享程序集前將其安裝到全局程序集高速緩沖存儲器GAC(Global Assembly Cache)中。.Net提供的命令行工具gacutil.exe用于支持這一功能。gacutil.exe可以將具有強名稱的程序集添至全局程序集緩存。命令格式為:

gacutil -I <程序集名稱>


其中,"程序集名稱"是要在全局程序集緩存中安裝的程序集的名稱。

下面的示例語句將文件名為 myAssembly.dll 的程序集安裝到全局程序集緩存:

gacutil -i myAssembly.dll


在客戶應用程序中使用共享程序集


在客戶應用程序中使用共享程序集的方法與私有程序集一樣簡單。創建客戶應用程序后,以與引用私有程序集相同的方式引用共享程序集,在應用程序代碼中包含共享程序集命名空間(using語句),這之后,你就可以象使用本地對象一樣使用共享程序集的公共對象了。

綜合上述,在.Net中使用VS.NET SDK進行共享程序集編程可分為以下步驟:

1)、生成共享程序集代碼文件(組件、類庫等)

2)、創建密鑰文件并簽名共享程序集

3)、在GAC中安裝共享程序集

4)、在客戶應用程序中使用共享程序集

下面的例子詳細說明以上過程。為節省篇幅,示例使用控制臺應用程序。Windows Forms應用程序中共享程序集編程與此類似。

1)、生成共享程序集代碼文件

這里,創建一個的Windows Class Library 類庫工程TestCreateSharedAssembly,它提供方法GetCreateDateTime()以返回文件的創建日期、時間信息。

public string GetCreateDateTime()
{DateTime dt=new DateTime();return dt.ToLongDateString();
}


2)、創建密鑰文件并簽名共享程序集

首先,使用Sn.exe強名工具生成密鑰對文件myKey.snk:

Sn.exe -k myKey.snk;


然后,修改AssemblyInfo.cs文件以簽名當前程序集:

[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile(@"d:/winapp/myKey.snk")](請指定myKey.snk文件的正確路徑)
[assembly: AssemblyKeyName("")]


這之后,編譯項目就將生成共享程序集TestCreateSharedAssembly.dll。

3)、在GAC中安裝共享程序集

在程序集中包含了密鑰對文件后,就可以使用全局程序集高速緩沖存儲器gacutil的/I選項把它安裝到全局程序集庫(Global Assembly Store)中,下面的語句將前一步創建的共享程序集TestCreateSharedAssembly.dll安裝到GAC中:

gacutil /I TestCreateSharedAssembly.dll

4)、在客戶應用程序中使用共享程序集

現在,創建一個Windows Console控制臺應用程序TestUseSharedAssembly。首先,引用前面創建的共享程序集TestCreateSharedAssembly.dll,這可以使用VS.Net主菜單(工程|添加引用)或集成解決方案Solution Explorer來完成,在點擊它們的"瀏覽"按鈕后的對話框中指定程序集TestCreateSharedAssembly.dll的正確路徑完成引用。

在當前應用程序代碼文件中,使用using語句包含欲使用共享程序集所在的命名空間TestCreateSharedAssembly,然后就可以象使用本地方法一樣使用共享程序集的GetCreateTime()對象(包括屬性、方法等)了。主要代碼如下:

using System;
using TestCreateSharedAssembly;//引用共享程序集名稱空間
namespace TestUseSharedAssembly
{
class Class1
{
static void Main(string[] args)
{		
TestCreateSharedAssembly.Class1 tcsa=new TestCreateSharedAssembly.Class1();//實例化
string 
datetime=tcsa.GetCreateDateTime();//調用所應用程序集的公共方法Console.WriteLine("Shared 
Assembly Create Time is:"+datetime);
}
}
}


編譯當前工程并在命令行中運行它,就會顯示所引用共享程序集的創建日期和時間信息:

Shared Assemby Create Time is:2002年12月10日

總結

以上是生活随笔為你收集整理的浅析.Net共享程序集编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。