程序集是.NET用於部署和配置單元的術語。編程
程序集是自我描述的安裝單元,由一個或多個文件組成。程序集能夠是包括元數據的DLL或EXE(如 圖1),它也能夠是由多個文件組成,例如,資源文件、模塊和EXE(如 圖2)。緩存
程序集能夠是私有或共享的。私有程序集或者位於應用程序所在的同一個目錄下,或者位於其子目錄中。共享程序集安裝在全局程序集緩存(global assembly cache,GAC)中。GAC容許共享系統上同一個程序集的不一樣版本。編輯器
附屬程序集是隻包含資源的程序集,它尤爲適用於本地化。工具
使用工具ildasm能夠查看程序集。spa
什麼是程序集?插件
一般擴展名是EXE或DLL的.NET可執行程序稱爲程序集。調試
程序集和本地DLL或EXE有什麼區別?code
他們的文件擴展名雖然相同,但.NET程序集包含元數據,這些元數據描述了程序集中定義的全部類型及其成員的信息,即方法、屬性、事件和字段。正是由於.NET程序集包含了元數據,才致使他與本地DLL與EXE的不一樣,因此說,元數據纔是描述程序集的最基礎數據。元數據是一種描述數據的數據。orm
什麼是程序集清單?對象
它是元數據的一部分,描述了程序集和引用它所須要的全部信息,並列出了它所擁有的依賴關係。
清單的組成:
- 標識(名稱、版本、文化和公鑰)。
- 屬於該程序集的文件列表。一個程序集能夠包含一個文件(如圖1),也能夠包含多個文件(如圖2)。
- 被引用的程序集列表。說明該程序集所使用的全部程序集。
- 許可請求。是指運行該程序集須要的許可。
- 導出的類型
什麼是模塊?
模塊是沒有程序集特性的DLL。所以模塊不是程序集,由於他不包含程序集特性。
爲何要使用模塊?
模塊能夠更快的啓動程序集,由於並非全部的類型都在一個文件中。模塊只在須要時加載。
使用模塊的另外一個緣由是多語言編程。一個模塊用VB編寫,另外一個模塊用C#編寫,這兩個模塊能夠包含在同一個程序集中。
程序集的特性:
當建立VS項目時,會自動生成源文件 AssemblyInfo.cs,可使用通常的源代碼編輯器配置程序集的特性。下面是從項目模板中生成的一個文件
using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Windows; // 有關程序集的通常信息由如下 // 控制。更改這些特性值可修改 // 與程序集關聯的信息。 [assembly: AssemblyTitle("PEViewer")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("PEViewer")] [assembly: AssemblyCopyright("Copyright © 2018")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // 將 ComVisible 設置爲 false 會使此程序集中的類型 //對 COM 組件不可見。若是須要從 COM 訪問此程序集中的類型 //請將此類型的 ComVisible 特性設置爲 true。 [assembly: ComVisible(false)] //若要開始生成可本地化的應用程序,請設置 //.csproj 文件中的 <UICulture>CultureYouAreCodingWith</UICulture> //例如,若是您在源文件中使用的是美國英語, //使用的是美國英語,請將 <UICulture> 設置爲 en-US。 而後取消 //對如下 NeutralResourceLanguage 特性的註釋。 更新 //如下行中的「en-US」以匹配項目文件中的 UICulture 設置。 //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] [assembly: ThemeInfo( ResourceDictionaryLocation.None, //主題特定資源詞典所處位置 //(未在頁面中找到資源時使用, //或應用程序資源字典中找到時使用) ResourceDictionaryLocation.SourceAssembly //常規資源詞典所處位置 //(未在頁面中找到資源時使用, //、應用程序或任何主題專用資源字典中找到時使用) )] // 程序集的版本信息由下列四個值組成: // // 主版本 // 次版本 // 生成號 // 修訂號 // // 能夠指定全部值,也可使用如下所示的 "*" 預置版本號和修訂號 // 方法是按以下所示使用「*」: : // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]這個文件用於配置程序集清單。編譯器讀取程序集特性,把特定信息插入到程序集清單中。
assembly:前綴把特性標記爲程序集級別特性。與其餘特性不一樣,程序集級別的特性與特定的語言元素無關。
用於程序集特性的參數是名稱空間 System.Reflection、System.Runtime.CompilerServices 和 System.InteropServices 中的類。
如下是程序集的特性列表:
表1
程序集的特性 說明 AssemblyCompany 指定公司名 AssemblyConfiguration 指定構建信息,例如零售或調試信息 AssemblyCopyright and
AssemblyTrademark包含版權和商標信息 AssemblyDefaultAlias 若是程序集名不容易理解(例如,動態建立程序集名時的GUID),就可使用該特性指定別名。 AssemblyDescription 描述程序集或產品。若是查看可執行文件的屬性,這個值就爲顯示爲Comments AssemblyProduct 指定程序集所屬產品的名稱 AssemblyTitle 給程序集提供一個友好名稱。該名稱能夠包含空格。使用文件屬性時,該值顯示爲Description AssemblyCulture 定義程序集文化。這個特性對附屬程序集很重要 AssemblyInformationalVersion 在引用程序集時,該特性不用於版本檢查,僅用於版本信息.該特性適合用於指定多個程序集的應用程序的版本。使用文件屬性時,該值顯示爲Product Version AssemblyVersion 給出程序集的版本號 AssemblyFileVersion 定義文件版本
可在VS中,項目屬性->應用程序->配置程序集信息 來配置這些信息
1.程序集是自描述的。程序集包含描述程序集的元數據。元數據包括從程序集導出的類型和一個清單。
2.程序集能夠並行加載。所謂並行加載的意思就是,假設程序集A引用共享程序集的版本1,程序集B引用共享程序集的版本2,而用戶同時引用程序集A和B,那麼應用程序須要同時引用共享程序集的1和2兩個版本,在.NET中應同時加載和使用兩個版本。.NET 4 中容許一個進程中有多個CLR版本,這樣就能夠加載有不一樣CLR要求的插件。不過,在同一個進程的不一樣CLR版本中,對象之間沒有直接通訊的.NET方式,可是能夠利用其餘技術解決,如COM。
3.程序集的獨立性。應用程序使用應用程序域來確保程序集的獨立性。利用應用程序域,許多程序集(程序集本來就是DLL或EXE)能夠獨立地運行在同一個進程中。運行在一個應用程序域內的一個程序集錯誤不會影響同一個進程中另外一個應用程序域的其餘程序集。
4.安裝簡單。只須要複製一個程序集中的全部文件,一條xcopy命令就夠了。這個特性稱爲ClickOnce部署。但在一些狀況下不能進行ClickOnce部署,而須要正常的Windows安裝。
程序集由描述它的程序集元數據、描述導出類型和方法的類型元數據、MSIL代碼和資源組成。全部這些部分都在一個文件中(見圖1),或者分佈在幾個文件中(見圖2)。