反射(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类 

posted on 2012-03-31 19:29  滴答的雨  阅读(9987)  评论(0编辑  收藏  举报