目錄html
在 《C# 7.0 本質論》中,關於這方面的知識在 《第十八章 反射、特性和動態編程》;在《C# 7.0 核心技術指南》中,這部份內容在《第19章 反射和元數據》。算法
在這裏咱們能夠得到一些關聯性很大的技術:反射、特性、元數據;編程
元數據:C# 編寫的程序編譯成一個程序集,程序集會包含元數據、編譯代碼和資源。
元數據包含內容:c#
反射:在運行時檢查並使用元數據和編譯代碼的操做稱爲反射。api
一個程序集包含的內容:安全
C# 編譯成的代碼會生成到 .dll 或 .exe 文件中,咱們能夠經過 Assembly 類,手動加載 程序集文件,實現各類操做。app
Assembly 類在 System.Reflection
命名空間中。ide
《C# 7.0 核心技術指南》中,列出類 Assembly 類經常使用的屬性和方法:函數
接下來咱們將經過代碼操做,瞭解 Assembly 的使用方法。加密
建立一個控制檯項目,並設置程序集描述信息。
微軟官方文檔建議使用的加載程序集的方式:
通常獲取程序集有三種方式:
如下方法能夠獲取到當前程序引用到的程序集:
AppDomain.CurrentDomain.GetAssemblies();
輸出
System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e ConsoleApp4, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null System.Runtime, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a System.Runtime.Extensions, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a System.Console, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
經過正在運行的類型、函數等形式,去獲取程序集。
Assembly 類: public static Assembly? GetAssembly(Type type); public static Assembly GetCallingAssembly(); public static Assembly? GetEntryAssembly(); public static Assembly GetExecutingAssembly(); Type 類: {type}.Assembly
解析說明:
位置 | 函數 | 說明 |
---|---|---|
Assembly | GetAssembly(Type) | 獲取在其中定義指定類型的當前加載的程序集 |
Assembly | GetCallingAssembly() | 返回方法(該方法調用當前正在執行的方法)的 Assembly |
Assembly | GetEntryAssembly() | 獲取默認應用程序域中的進程可執行文件。 在其餘的應用程序域中,這是由 ExecuteAssembly(String)執行的第一個可執行文件 |
Assembly | GetExecutingAssembly() | 獲取包含當前執行的代碼的程序集 |
Type | Assembly | 返回一個類型所在的程序集 |
Assembly assem = typeof(Console).Assembly; Assembly ass = Assembly.GetExecutingAssembly();
函數 | 說明 |
---|---|
LoadFrom(String) | 已知程序集的文件名或路徑,加載程序集 |
LoadFrom(String, Byte[], AssemblyHashAlgorithm) | 經過給定程序集文件名或路徑、哈希值及哈希算法來加載程序集 |
LoadFrom(String, Evidence) | 在給定程序集的文件名或路徑並提供安全證據的狀況下,加載程序集 |
LoadFrom(String, Evidence, Byte[], AssemblyHashAlgorithm) | 經過給定程序集文件名或路徑、安全證據、哈希值及哈希算法來加載程序集 |
Assembly ass = Assembly.LoadFrom(@"X:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\3.0.0\ref\netcoreapp3.0\System.Console.dll");
另外還有更多中加載程序集的方法,這些方法很偏僻,不必列出來(由於我不會)。
得到 Assembly 對象後,就能夠進行一系列的騷操做。
經常使用的 Assembly 函數能夠查看圖三。
先設置兩個 Assembly 對象
Assembly assemA = typeof(Console).Assembly; Assembly assemB = Assembly.GetExecutingAssembly();
Console.WriteLine("程序集徹底限定名"); Console.WriteLine(assemA.FullName); Console.WriteLine(assemB.FullName);
程序集徹底限定名 System.Console, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ConsoleApp4, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
裏面有個 PublicKeyToken 屬性,前面咱們介紹了 Assembly 獲取程序集的方式,經過 PublicKeyToken ,咱們也可使用 Load 來加載程序集。
可是你能夠看到上面的輸出, System.Console 有 PublicKeyToken 值,可是本身建立的項目 ConsoleApp4 沒有。
AssmblyName 是用來完整描述程序集的類型。
AssmblyName 是用來獲取 程序集 各類信息的類,自己不具備操做功能,僅用於獲取程序集的元數據信息。
AssmblyName 實例可使用 Assembly 的 GetName()
方法獲取。
屬性 | 說明 |
---|---|
CodeBase | 獲取或設置程序集的 URL 位置。 |
ContentType | 獲取或設置指示程序集包含的內容類型的值。 |
CultureInfo | 獲取或設置程序集支持的區域性。 |
CultureName | 獲取或設置與此程序集關聯的區域性名稱。 |
EscapedCodeBase | 獲取 URI,包括表示基本代碼的轉義符。 |
Flags | 獲取或設置該程序集的屬性。 |
FullName | 獲取程序集的全名(也稱爲顯示名稱)。 |
HashAlgorithm | 獲取或設置程序集清單使用的哈希算法。 |
KeyPair | 獲取或設置用於爲程序集建立強名稱簽名的加密公鑰/私鑰對。 |
Name | 獲取或設置程序集的簡單名稱。 這一般(但不必定)是程序集的清單文件的文件名,不包括其擴展名。 |
ProcessorArchitecture | 獲取或設置一個值,該值標識可執行文件的目標平臺的處理器和每字位數。 |
Version | 獲取或設置程序集的主版本號、次版本號、內部版本號和修訂號。 |
VersionCompatibility | 獲取或設置與程序集同其餘程序集的兼容性相關的信息。 |
AssemblyName assemNameA = assemA.GetName(); AssemblyName assemNameB = assemB.GetName(); Console.WriteLine("程序集名稱: {0}", assemNameA.Name); Console.WriteLine("程序集名稱: {0}", assemNameB.Name); // 版本 Console.WriteLine("\nVersion: {0}.{1}", assemNameA.Version.Major, assemNameA.Version.Minor); Console.WriteLine("Version: {0}.{1}", assemNameB.Version.Major, assemNameB.Version.Minor); // 程序集的物理文件位置 Console.WriteLine("\nAssembly CodeBase:{0}", assemA.CodeBase); Console.WriteLine("\nAssembly CodeBase:{0}", assemB.CodeBase);
輸出信息
程序集名稱: System.Console 程序集名稱: ConsoleApp4 Version: 4.1 Version: 1.0 Assembly CodeBase:file:///x:/Program Files/dotnet/shared/Microsoft.NETCore.App/3.0.1/System.Console.dll Assembly CodeBase:file:///X:/Users/whuanle/source/repos/ConsoleApp4/ConsoleApp4/bin/Debug/netcoreapp3.0/ConsoleApp4.dll
除了 GetName()
,Assembly 類還提供了許多與成員的有關程序集的信息。 例如:
上面說到,加載程序集的方式通常使用三種方法:
上面已經演示運行時獲取和 LoadFrom
兩種獲取方式。
下面來繼續介紹 Assembly.Load()
和 Assembly.LoadFile()
。
Assembly.Load()
以強類型的方式去加載程序集,
強名稱和程序集簽名 指的是 程序集具備惟一的和不可更改的標識。
何覺得強類型?經過在清單中添加以下的兩種元數據實現:
屬於該程序集做者的惟一編號;
程序集簽名後的散列值,以證明該程序集是由持有其惟一編號的做者生成;
關於這部份內容能夠參考 《C# 7.0 核心技術指南》的《18.2 強名稱和程序集簽名》部分,這裏再也不贅述。
Assembly.Load()
加載程序集,同時能夠自動加載程序集引用到的其它程序集,而且不會形成重複加載問題。
使用示例:
Assembly assemA = Assembly.Load("System.Console"); Assembly assemB = Assembly.Load("ConsoleApp4"); Assembly assemC = Assembly.Load("System.Console, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
地址:https://www.cnblogs.com/weifeng123/p/8855629.html
參考:深刻了解C#反射中Assembly.Load()、Assembly.LoadFrom()、Assembly.LoadF ile ()方法
地址:https://blog.csdn.net/xuchen_wang/article/details/92773260
Assembly.LoadFile()
跟 Assembly.LoadFrom
的使用方法一致。
區別: Assembly.LoadFile()
只會加載指定的一個程序集; Assembly.LoadFrom
會加載一個程序集,而後自動加載此程序集依賴的其它程序集。
此文僅受權《NCC 開源社區》訂閱號發佈