程序集是 .NET Framework 應用程序的構造塊;程序集構成了部署、版本控制、重復使用、激活范圍控制和安全權限的基本單元。
屬性:
CodeBase,EntryPoint,EscapeCodeBase,Evidence,FullName,GlobalAssemblyCache,HostContext,ImageRuntimeVersion,IsDynamic,IsFullTrusted,Location,ManifestModule,PermissionSet,ReflectionOnly,SecurityRuleSet
事件:
實例方法:
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 、搜索是否區分大小寫、搜索成員標識BindingFlags、System.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()
8. 提供實例方法獲取|加載模塊、獲取類型
GetLoadedModules()、GetModules()、GetModule()、LoadModule()、GetTypes()、GetType()
9. GetExportedTypes()
獲取此程序集中定義的公共類型,這些公共類型在程序集外可見。只有公共類型以及嵌套在其他公共類型中的公共類型才在程序集外可見。
10. 返回 AssemblyName 對象的方法:GetName()、GetReferencedAssemblies()
11. GetFile()、GetFiles()
獲取此程序集清單的文件表中文件的 System.IO.FileStream。
12. 提供獲取程序集清單相關方法
《反射機制》系列:
參考資源: