反射(3)程序集加载 Assembly类
程序集是 .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. 提供获取程序集清单相关方法
《反射机制》系列:
参考资源:
作者:滴答的雨
出处:http://www.cnblogs.com/heyuquan/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
欢迎园友讨论下自己的见解,及向我推荐更好的资料。
本文如对您有帮助,还请多帮 【推荐】 下此文。
谢谢!!! (*^_^*)
技术群:(339322839广西IT技术交流),欢迎你的加入