學(xué)習(xí)C#程序集
一、C#程序集的一些基本概念:
程序集是包含一個或多個類型定義文件和資源文件的集合。它允許我們分離可重用類型的邏輯表示和物理表示。
程序集是一個可重用、可實(shí)施版本策略和安全策略的單元。它允許我們將類型和資源劃分到不同的文件中,這樣程序集的使用者便可以決定將哪些文件打包在一起部署。一旦CLR加載了程序集中包含清單的那個文件,它就可以確定程序集的其他文件中哪些包含了程序正在引用的類型和資源。任何程序集的使用者僅需要知道包含清單的文件名稱。文件的劃分對使用者是透明的,并且可以在將來改變,同時又不會破壞現(xiàn)有應(yīng)用程序的行為。
C#程序集的特性:
1、程序集定義了可重用的類型。
2、程序集標(biāo)識有一個版本號。
3、程序集可以包含與之相關(guān)的安全信息。
二、多文件集:
使用多文件集的三個原因:
1、可以將類型分別實(shí)現(xiàn)在不同的文件中,從而允許文件在互聯(lián)網(wǎng)環(huán)境中進(jìn)行增量下載。
2、可以按需要向程序集中添加資源或數(shù)據(jù)文件。(數(shù)據(jù)文件可以是任何格式:文本文件、Excel電子表格、Word表格、或者任何我們喜歡的格式)。
3、可以使我們創(chuàng)建的程序集包含一些用不同編程語言實(shí)現(xiàn)的類型。
注意:Visual Studio .NET集成開發(fā)環(huán)境(Integrated development environment,簡稱IDE)本身不支持創(chuàng)建多文件程序集,如果需要創(chuàng)建多文件程序集,必須求助于命令行工具。
兩個源代碼文件:Rut.cs (包含很少使用的類型)Fut.cs (包含經(jīng)常使用的類型)
- csc /t:module Rut.cs //生成Rut.netmodule文件
- csc /out:UnionType.dll /t:library /addmodule Rut.netmodule Fut.cs
- //生成UnionType.dll類庫文件 Run.netmodule文件作為程序集的一部分來對待
三、程序鏈接器:
程序鏈接器:Assembly Linker 即AL.exe
1、使用前提:
如果我們要創(chuàng)建的程序集包含來自不同編譯器生成的模塊,而使用的編譯器又不支持類似于C#中/addmodule那樣的命令行開關(guān),或者生成模塊時還不知道程序集的打包需求,這時程序集鏈接器就顯得非常有用。
2、使用實(shí)例:
- csc /t:module Rut.cs
- csc /t:module Fut.cs
- al /out: UnionType.dll /t:library Fut.netmodule Rut.netmodule
四、資源文件的添加
1.使用csc.exe來添加資源文件:
/resource 將把指定的資源文件嵌入到產(chǎn)生的程序集PE文件中,并更新ManifestResourceDef表中的內(nèi)容。
/linkresource 將向ManifestResourceDef和FileDef清單表中添加一條目,使其指向一個單獨(dú)的資源文件。
2.使用AL.exe來添加資源文件:
/embed[resource]:該命令行接受任何類型的文件,將其內(nèi)容嵌入到產(chǎn)生的PE文件中。同時,清單中的ManifestResourceDef表將被更新以反映該資源的存在。
/link[resource]:該命令將只更新清單中的ManifestResourceDef表和FileDef表,以反映資源的存在,并標(biāo)識出程序集的哪個文件包含著資源文件。資源文件本身不會被嵌入到程序集PE文件中,它仍然保持獨(dú)立,并且須和其它程序一起打包、部署。
3.將Win32資源嵌入到程序集中:
通過AL.exe或csc.exe添加/win32res命令行開關(guān)指定一個.res文件路徑來實(shí)現(xiàn)。
通過AL.exe或csc.exe添加/win32icon命令行開關(guān)并指定一個.ico文件路徑來實(shí)現(xiàn)。
五、C#程序集版本信息:
版本號由四個部分組成:主版本號、次版本號、生成版本號、修訂版本號
例:2.5.719.2 主版本號與次版本號組成“面向公眾”的版本部分,第三個版本號719表示程序集的生成版本,***一個版本號2表示對生成版本的修訂版本。
一個程序集的三個相關(guān)版本號:
1、AssemblyFileVersion: 該版本號存儲在Win32版本資源中,它僅僅是一個輔助性的信息。
2、AssemblyInformationalVersionAttribute:該版本號也存儲在Win32版本資源中,僅輔助性作用。
3、AssemblyVersion:該版本號存儲在AssemblyDef清單元數(shù)據(jù)表中。這個版本號非常重要,它用來惟一地標(biāo)識一個程序集。
六、語言文化:
不提倡創(chuàng)建包含代碼的衛(wèi)星程序集,但還是有可能做到。如果我們愿意,仍然可以用System.Reflection.AssemblyCultureAttribute定制特性來代替AL.exe的/culture命令行開關(guān)來指定語言文化。示例如下:
//將程序集的語言文化設(shè)置為瑞士德語
[assembly :AssemblyCulture (“de-CH”)]
通常情況下,我們創(chuàng)建的程序集不應(yīng)該引用衛(wèi)星程序集。也就是一個程序集的AssemblyRef條目指向的都應(yīng)該是語言文化中性的程序集。如果想訪問一個衛(wèi)星程序集中的類型或成員,我們應(yīng)該使用反射技巧。
衛(wèi)星程序集:標(biāo)識著特定語言文件的程序集稱為衛(wèi)星程序集。
七、共享程序集:
1..NET框架支持的兩種程序集:
弱命名程序集:Weakly named assembly
強(qiáng)命名程序集:Strongly named assembly
二者之間的真正區(qū)別在于:強(qiáng)命名程序集有一個發(fā)布者的公鑰/私鑰對簽名,其中的公鑰/私鑰匙對惟一地標(biāo)識了程序集的發(fā)布者。
強(qiáng)命名集包含四個惟一標(biāo)識程序集的特性:文件名(沒有擴(kuò)展名)、版本號、語言文化標(biāo)識和一個公有密鑰標(biāo)識。
例:”MyTypes,Version=1.0.8123.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”
2.強(qiáng)命名實(shí)用工具:
Strong Name Utility即SN.exe 和.Net框架SDK,以及Visual studio .Net一起發(fā)布的一個工具。
例:SN –k MyCompany.keys
該命令告訴SN.exe創(chuàng)建一個名為Mycompany.keys的文件。Mycompany.keys文件將包含一對以二進(jìn)制格式存儲的公有密鑰和私有密鑰。
查看公有密鑰:(必須執(zhí)行下面兩步)
SN –p MyCompany.keys MyCompany.publickey
SN –tp MyCompany.publickey
創(chuàng)建強(qiáng)命名程序集:
[assembly: AssemblykeyFile ( “MyCompany.keys”)]
3.程序集的兩種部署方式:即私有部署方式和全局部署方式
私有部署方式將程序集部署在應(yīng)用程序的基目錄及其子目錄下,弱命名程序集只能進(jìn)行私有部署。
全局部署方式將程序集部署在一些CLR確知的地方。強(qiáng)命名程序集既可以進(jìn)行私有部署,也可以進(jìn)行全局部署。
4.System.Reflection.AssemblyName類:
利用它,我們可以很容易地創(chuàng)建一個程序集名稱,并獲取一個程序集名稱的各個部分。公有實(shí)例屬性:如CultureInfo、FullName、KeyPair、Name以及Version.該類提供了幾個公有實(shí)例方法,如GetPublicKey、GetPublicKeyToken、SetPublicKey、以及SetPublicKeyToken。
八、其他
元數(shù)據(jù)標(biāo)識是一個4字節(jié)的數(shù)值,其高位字節(jié)表示標(biāo)記的類型(0x01 = TypeRef ,0x02 =TypeDef, 0x26 = FileDef , 0x27 = ExportedType)
為使我們創(chuàng)建的C#程序集出現(xiàn)在.NET選項(xiàng)卡的列表中,可以將下面的子鍵添加到注冊表中:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\
【編輯推薦】