.net 程序集


前言:用了幾天的時間把高級編程里面程序集一章看完了,原來自己只知道寫代碼,右鍵添加引用,從來也不知道操作的實質是什么,微軟總是這個套路,鼠標點點就能把任務完成,這對新手友好但是對要通透了解程序執行和內部原理的程序員來說真是有點膈應。

程序集的概述

1.1程序集定義

程序集是 .net 應用程序的部署單元。.net應用程序包含一個或多個程序集。通常拓展名是exe或dll的 .net可執行文件被稱為程序集。

程序集是自我描述的安裝單元,由一個或多個文件組成。

程序集可以是私有的或共享的。在簡單的 .net應用程序中,最好使用私有程序及工作。私有程序集沒有特殊的管理、注冊和版本設置的問題。

1.2程序集的功能

程序集的功能總結如下:

  • 程序集是自描述的。不在需要考慮注冊表鍵,從其他地方獲得類型庫等問題。程序集包含了描述程序集的元數據。元數據包括從程序集中導出的類型和一個清單。
  • 版本的相互依賴性在程序集的清單中進行的記錄。
  • 程序集可以並行加載,同一個DLL的不同版本可以在系統上同時使用。
  • 應用程序使用應用程序域來確保其獨立性。使用應用程序域,許多應用程序就可以獨立的運行在一個機制中。一個應用程序中的錯誤不會直接影響同一個進程中的其他應用程序。

1.3程序集的結構

程序集由描述它的程序集元數據,描述導出賴幸和方法的類型元數據,MSIL代碼和資源。所有的這些部分都在一個文件中,或者分布在幾個文件中。

(太具體的知識涉及到IL,作為程序開發,如果不是有需要我覺得沒有必要深究)

1.4 程序集清單

程序集清單是元數據的一部分,描述了程序集和引用它所需要的所有信息,並列出來它所有的依賴關系。清單有以下部分組成:

  • 標識(名稱,版本,區域性和公鑰)
  • 屬於該程序集的一個文件列表。一個程序集只要要有一個文件,也可以包含多個文件。
  • 被引用程序集的列表。在程序集清單中說明了再程序集中使用的所有程序集,這些引用信息包括版本信息和公鑰。公鑰用於唯一地標識程序集。
  • 一組許可請求————運行這個程序集需要的許可。
  • 導出類型。

1.5 程序集的特性

在創建Visual Studio項目時,會自動生成AssemblyInfo.cs,這個文件用於配置程序集清單,編譯器讀取特性,把特定的信息插入到程序集清單中。

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// 有關程序集的常規信息通過以下
// 特性集控制。更改這些特性值可修改
// 與程序集關聯的信息。
[assembly: AssemblyTitle("StrongNameTest")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("StrongNameTest")]
[assembly: AssemblyCopyright("Copyright ©  2016")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 將 ComVisible 設置為 false 使此程序集中的類型
// 對 COM 組件不可見。  如果需要從 COM 訪問此程序集中的類型,
// 則將該類型上的 ComVisible 特性設置為 true。
[assembly: ComVisible(false)]

// 如果此項目向 COM 公開,則下列 GUID 用於類型庫的 ID
[assembly: Guid("3583900e-78ff-4a15-9168-ad05faf1e0fd")]

// 程序集的版本信息由下面四個值組成: 
//
//      主版本
//      次版本 
//      生成號
//      修訂號
//
// 可以指定所有這些值,也可以使用“生成號”和“修訂號”的默認值,
// 方法是按如下所示使用“*”: 
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

諸如引用秘鑰文件為程序集創建強命的操作都可以在這里配置


程序集和應用程序域的關系

在 .net之前的技術中,進程作為獨立的邊界來使用,每個進程都有其私有的虛擬內存;運行在一個進程的應用程序不能寫入另個一個應用程序的內存,也不會因為這種方式破壞其他的應用程序。該進程引用程序之間的一個獨立安全的邊界。在 .net體系結構中,應用程序有一個新的邊界:應用程序域。使用托管IL代碼,運行庫可以確保在同一個進程中不能訪問另一個應用程序的內存。
多個應用程序可以運行在一個進程的多個應用程序域中。
和一個完整的進程相比,應用程序域的CPU和內存占用要小的多。因此CLR加載和卸載應用程序域比起完整的進程來說也快的多。

在 .net中,AppDomain類是用來操作應用程序域的,具體代碼操作在AppDomain操作

下面是程序集的簡單操作

      static void Main(string[] args)
        {
            AppDomain currentAppDomain = AppDomain.CurrentDomain;
            Console.WriteLine(currentAppDomain.FriendlyName);

            AppDomain secondDomain = AppDomain.CreateDomain("New AppDomain");
            //
            secondDomain.ExecuteAssembly("TestAppDomain.exe");  

            secondDomain.CreateInstance("TestAppDomain", "TestAppDomain.Demo", true, BindingFlags.CreateInstance,
                null, new object[] { 7, 3 }, null, null);

            Console.ReadKey();

        }

共享程序集

程序集可以由一個應用程序單獨使用,在默認情況下不共享程序集。在使用共享程序集是,需要考慮一些特定的要求。

2.1強命

自己的理解,.net中強命的設計是GUID+摘要算法+非對稱加密

  • GUID保證共享程序集名稱是全局唯一的
  • 摘要算法保證內容不被篡改
  • 非對稱加密保證發布者合法,對摘要算法結果進行加密保證文件不被篡改

2.2全局程序集緩存

顧名思義,全局程序集緩存(Global Assembly Cache)就是可全局使用的程序集的緩存。大多數共享程序集都安裝在這個緩存中;另外,也可以使用共享目錄(也在服務器上)。

GAC位於 \assembly目錄下。

gacutil.exe 實用工具可以使用命令行安裝、卸載和顯示程序集。更加具體的操作在博客園地址中留作備用,這里就不贅述了。

先寫這么多吧,感覺更多的東西需要工作中再補充,這里總結只是一些概念


免責聲明!

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



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