反射(3)程序集加載 Assembly類


 

程序集是 .NET Framework 應用程序的構造塊;程序集構成了部署、版本控制、重復使用、激活范圍控制和安全權限的基本單元。

屬性:

CodeBaseEntryPointEscapeCodeBaseEvidenceFullNameGlobalAssemblyCacheHostContextImageRuntimeVersionIsDynamicIsFullTrustedLocationManifestModulePermissionSetReflectionOnlySecurityRuleSet

事件:

實例方法:

CreateInstance()GetCustomAttributesData()GetExportedTypes()GetFile()GetFiles()GetLoadedModules()GetManifestResourceInfo()GetManifestResourceNames()GetManifestResourceStream()GetModule()GetModules()GetName()GetReferenceAssemblies()GetSatelliteAssembly()GetType()GetTypes()LoadModule()

接口方法

a)         ICustomAttributeProvider

GeCustomAttributes()IsDefined()

b)         ISerializable

靜態方法:

CreateQualifiedName()GetAssembly()GetCallingAssembly()GetEntryAssembly()GeExecutingAssembly()Load()LoadFile()LoadFrom()LoadModule()LoadWithPartialName()ReflectionOnlyLoad()ReflectionOnlyLoadFrom()UnsafeLoadFrom()

 

1.         Assembly.ModuleResolve 事件

公共語言運行時類加載程序不能通過正常方法解析對程序集的內部模塊的引用時發生。如使用 LoadFile(Path)、只反射加載等加載程序集,不會加載依賴程序集。

2.         CodeBase EscapedCodeBase Location

1)         CodeBase

獲取最初指定的程序集的位置,例如,在 AssemblyName 對象中指定的位置。

如果程序集是使用Load(byte[]) 重載作為字節數組加載的,則此屬性返回該方法的調用方的位置,而不是已加載程序集的位置。

2)         EscapedCodeBase 

獲取 URI,包括表示基本代碼的轉義符。

3)         Location 

獲取包含清單的已加載文件的路徑或 UNC 位置。(絕對路徑)

4)         術語:UNC (Universal Naming Convention) 統一命名約定

對於網絡服務器上的目標文件,可使用“通用命名約定 (UNC)地址(UNC:“統一命名約定”地址,用於確定保存在網絡服務器上的文件位置)。這些地址以“file:\\”開始並提供服務器名、共享名和文件的完整路徑。例如,“file:\\server\share\path\project file.mpp”是絕對 UNC 地址。 

3.         IsDynamic

獲取一個值,該值指示當前程序集是否是通過使用反射發出在當前進程中動態生成的。動態程序集由派生類 System.Reflection.Emit.AssemblyBuilder 表示;將動態程序集保存到磁盤后,該程序集就不再是動態的。

4.         CreateInstance()

從此程序集中查找指定的類型,並使用系統激活器 ( Activator.CreateInstance ) 創建它的實例。

可傳遞要搜索的類型的 Type.FullName 、搜索是否區分大小寫、搜索成員標識BindingFlagsSystem.Reflection.Binder對象、類型構造函數的參數數組等參數。

5.         CreateQualifiedName()

創建由類型的程序集的顯示名稱限定的類型的名稱。返回的字符串的格式為: <完整類型名稱><程序集顯示名稱>   即: return (typeName + ", " + assemblyName)

6.         GetAssembly()GetCallingAssembly()GetEntryAssembly()GetExecutingAssembly()GetSatelliteAssembly()

1)         GeAssembly(Type type)  

獲取在其中定義指定類的當前加載的程序集。

2)         GetCallingAssembly()     

返回調用當前正在執行的方法的方法的 Assembly

如果調用 GetCallingAssembly 方法的方法由實時 (JIT) 編譯器內聯擴展,或如果其調用方將內聯擴展,則由 GetCallingAssembly 返回的程序集可能會發生異常。例如,考慮下列方法和程序集:

程序集 A1 中的方法 M1 調用 GetCallingAssembly

程序集 A2 中的方法 M2 調用 M1

程序集 A3 中的方法 M3 調用 M2

M1 未內聯時,GetCallingAssembly 返回 A2。當 M1 內聯時,GetCallingAssembly 返回 A3

使用MethodImplOptions.NoInlining可以阻止JIT在編譯時把某些方法進行內聯處理。EG[MethodImpl(MethodImplOptions.NoInlining)]

3)         GetEntryAssembly()

獲取默認應用程序域中的進程可執行文件。在其他的應用程序域中,這是由 AppDomain.ExecuteAssembly 執行的第一個可執行文件。

如果一個非托管應用程序創建了使用 C# 編寫的一個 COM 組件的實例,則從該 C# 組件調用 GetEntryAssembly 方法將返回 null,因為該進程的入口點是非托管代碼而不是托管程序集。

4)         GetExecutingAssembly()

                  獲取包含當前執行的代碼的程序集。

5)         GetSatelliteAssembly( CultureInfo culture,Version version )

獲取指定區域性的附屬程序集的指定版本。

附屬程序集包含本地化的資源,這與主應用程序程序集有所不同,主應用程序程序集包含不可本地化的可執行代碼和只用於默認或非特定區域性的資源。

調用 GetSatelliteAssembly(CultureInfo) 重載以使用當前的程序集版本。

7.         Load()LoadFile()LoadFrom()LoadWithPartialName()ReflectionOnlyLoad()ReflectionOnlyLoadFrom()UnsafeLoadFrom()

    請參見 《(7)動態程序集加載Load()》

8.         提供實例方法獲取|加載模塊、獲取類型

        GetLoadedModules()GetModules()GetModule()LoadModule()GetTypes()GetType()

9.         GetExportedTypes()

獲取此程序集中定義的公共類型,這些公共類型在程序集外可見。只有公共類型以及嵌套在其他公共類型中的公共類型才在程序集外可見。

10.     返回 AssemblyName 對象的方法:GetName()GetReferencedAssemblies()

11.     GetFile()GetFiles()

獲取此程序集清單的文件表中文件的 System.IO.FileStream

12.     提供獲取程序集清單相關方法

     

 

   《反射機制》系列:

                 (1)程序集基礎知識

                 (2)強名稱程序集與數字證書

                 (3)程序集加載 Assembly類

                 (4)綁定程序集配置策略

                 (5)CLR 運行時探測程序集引用的步驟

                 (6)程序集加載上下文

                 (7)動態程序集加載Load()

                 (8)程序集反射 Type 類

                 (9)程序集的加載和反射

參考資源:

            (MSDN)Assembly類 


免責聲明!

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



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