C#編程(八十三)---------- 程序集的含義


程序集的含義

一.程序集是包含一個或多個類型定義文件和資源文件的集合.它允許我們分析可重用類型的邏輯表示和物理表示.

 

相當於你定義了一個項目XXProject,項目存在很多文件(類,窗體,接口,資源等等),編譯生成一個DLL文件,就是程序集.

當你使用這個程序集的時候,引用改程序及就可以得到該程序集里面的所有東西(類,窗體,接口,資源).

 

 

程序集的特征如下:

1.程序集定義了可重用的類型

2.程序集標識有一個版本號

3.程序集可以包含與之相關的安全信息

 

二.使用程序集的原因(也就是使用多文件集的原因):

1.可以將類型分別實現在不同的文件中,從而允許文件在互聯網環境中進行增量下載

2.可以按照需要向程序集中添加資源或數據文件(數據文件可以是任務格式:文本文件,電子表格,word文檔等等)

3.可以是我們創建的程序集包含一些用不同編程語言實現的類型.

注意:VS.NET計策后功能開發環境本身不支持創建多文件程序集,如果需要創建多文件程序集,必須求助於命令行工具.

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

使用前提:

如果我們要創建的程序集包含來自不同的編譯器生成的模塊,而使用的編譯器又不支持類似於C#中/addmodule那樣的命令行開關,或者生成模塊時還不知道程序集的打包需求,這時程序集鏈接器就顯示非常有用。

 

使用實例:

csc /t:module Rut.cs  

 

csc /t:module Fut.cs  

 

al /out: UnionType.dll /t:library Fut.netmodule Rut.netmodule  

 

 

四.資源文件的添加

1.使用csc.exe來添加資源文件:

/resource 將把指定的資源文件嵌入到產生的程序集PE文件中,並更新ManifestResourceDef表中的內容。

/linkresource 將向ManifestResourceDef和FileDef清單表中添加一條目,使其指向一個單獨的資源文件。

2.使用AL.exe來添加資源文件:

/embed[resource]:該命令行接受任何類型的文件,將其內容嵌入到產生的PE文件中。同時,清單中的ManifestResourceDef表將被更新以反映該資源的存在。

/link[resource]:該命令將只更新清單中的ManifestResourceDef表和FileDef表,以反映資源的存在,並標識出程序集的哪個文件包含着資源文件。資源文件本身不會被嵌入到程序集PE文件中,它仍然保持獨立,並且須和其它程序一起打包、部署。

3.將Win32資源嵌入到程序集中:

通過AL.exe或csc.exe添加/win32res命令行開關指定一個.res文件路徑來實現。

通過AL.exe或csc.exe添加/win32icon命令行開關並指定一個.ico文件路徑來實現。

 

 

 

五、C#程序集版本信息:

版本號由四個部分組成:主版本號、次版本號、生成版本號、修訂版本號

例:2.5.719.2 主版本號與次版本號組成“面向公眾”的版本部分,第三個版本號719表示程序集的生成版本,最后一個版本號2表示對生成版本的修訂版本。

一個程序集的三個相關版本號:

1、AssemblyFileVersion: 該版本號存儲在Win32版本資源中,它僅僅是一個輔助性的信息。

2、AssemblyInformationalVersionAttribute:該版本號也存儲在Win32版本資源中,僅輔助性作用。

3、AssemblyVersion:該版本號存儲在AssemblyDef清單元數據表中。這個版本號非常重要,它用來惟一地標識一個程序集。

 

 

 

六、語言文化:

不提倡創建包含代碼的衛星程序集,但還是有可能做到。如果我們願意,仍然可以用System.Reflection.AssemblyCultureAttribute定制特性來代替AL.exe的/culture命令行開關來指定語言文化。示例如下:

//將程序集的語言文化設置為瑞士德語

[assembly :AssemblyCulture (“de-CH”)]

通常情況下,我們創建的程序集不應該引用衛星程序集。也就是一個程序集的AssemblyRef條目指向的都應該是語言文化中性的程序集。如果想訪問一個衛星程序集中的類型或成員,我們應該使用反射技巧。

衛星程序集:標識着特定語言文件的程序集稱為衛星程序集。

七、共享程序集:

1..NET框架支持的兩種程序集:

弱命名程序集:Weakly named assembly

強命名程序集:Strongly named assembly

二者之間的真正區別在於:強命名程序集有一個發布者的公鑰/私鑰對簽名,其中的公鑰/私鑰匙對惟一地標識了程序集的發布者。

強命名集包含四個惟一標識程序集的特性:文件名(沒有擴展名)、版本號、語言文化標識和一個公有密鑰標識。

例:”MyTypes,Version=1.0.8123.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”

2.強命名實用工具:

Strong Name Utility即SN.exe 和.Net框架SDK,以及Visual studio .Net一起發布的一個工具。

例:SN –k MyCompany.keys

該命令告訴SN.exe創建一個名為Mycompany.keys的文件。Mycompany.keys文件將包含一對以二進制格式存儲的公有密鑰和私有密鑰。

查看公有密鑰:(必須執行下面兩步)

SN –p MyCompany.keys MyCompany.publickey

SN –tp MyCompany.publickey

創建強命名程序集:

[assembly: AssemblykeyFile ( “MyCompany.keys”)]

3.程序集的兩種部署方式:即私有部署方式和全局部署方式

私有部署方式將程序集部署在應用程序的基目錄及其子目錄下,弱命名程序集只能進行私有部署。

全局部署方式將程序集部署在一些CLR確知的地方。強命名程序集既可以進行私有部署,也可以進行全局部署。

4.System.Reflection.AssemblyName類:

利用它,我們可以很容易地創建一個程序集名稱,並獲取一個程序集名稱的各個部分。公有實例屬性:如CultureInfo、FullName、KeyPair、Name以及Version.該類提供了幾個公有實例方法,如GetPublicKey、GetPublicKeyToken、SetPublicKey、以及SetPublicKeyToken。

八、其他

元數據標識是一個4字節的數值,其高位字節表示標記的類型(0x01 = TypeRef ,0x02 =TypeDef, 0x26 = FileDef , 0x27 = ExportedType)

為使我們創建的C#程序集出現在.NET選項卡的列表中,可以將下面的子鍵添加到注冊表中:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM