[C#]C#学习笔记-类型反射,晚期绑定,进程,对象上下文

C#学习笔记-类型反射,晚期绑定,进程,对象上下文

罗朝辉(http://www.cnblogs.com/kesalin/

《C#与.NET高级程序设计》读书笔记

 

反射(Reflection)

1,程序集的元数据不仅可以描述一组内部类型,而且也可以描述任何一个被内部类型引用的外部类型。

2,反射是一个运行库类型发现的过程,通过反射,我们可以通过编程得到与通过ildasm.exe显示相同的元数据信息。反射定义在 System.Reflection命名空间中,而 System.Type 类定义了大量用来检查一个类型的元数据的接口。

3,我们可以使用 System.Object.GetType(), System.Type.GetType()以及typeof()运算符来获取 Type 引用。

晚期绑定,特性

4,晚期绑定是一种创建一个给定类型的实例并在运行时调用其成员,而不需要在编译时知道它存在的一种技术。晚期绑定对程序的可扩展性非常重要。System.Activator 类是.NET晚期绑定过程中的关键所在,它仅仅定义了几个成员方法,其中大多数与.NET远程处理有关。

5,.NET平台运行我们使用特性(attribute)把更多的元数据嵌入到程序集中。简言之,特性就是用于类型,成员,程序集或模块的代码注解。.NET特性是扩展了抽象的 System.Attribute 基类的类类型,我们可以自该类派生出新类型来创建自定义特性。必须通过显式的反射才能在代码中使用特性。

 

进程,应用程序域和对象上下文

6,进程承载一组相关的.NET程序集,而应用程序域(AppDomain)是对该进程的逻辑细分。一个应用程序域进一步被细分成多个上下文边界,这些边界用来分组目的相似的.NET对象。使用上下文的概念,CLR便能够确保恰当地控制那些带特殊运行时要求的对象。

7,System.Diagnostics 命名空间定义了许多类型,它们允许我们以编程方式访问进程和许多与诊断相关的类型,比如系统事务日志,性能计数器,进程相关等。

8,.NET平台下,程序集并没有直接承载在进程中,.NET可执行程序承载在进程的一个逻辑分区中,术语称为应用程序域(AppDomain)。可见,一个进程可以包含多个应用程序域,每一个应用程序域承载一个.NET可执行程序。这与传统的Win32进程相比,有如下好处:第一,应用程序域是.NET平台操作系统独立性的关键特性。这种逻辑分区将不同操作系统表现加载可执行程序的差异抽象化了。第二,和一个完整的进程相比,应用程序域的CPU和内存占用都要少得多。因此CLR加载和卸载应用程序域比起完整的进程来说也要快得多。第三,应用程序域为承载的应用程序提供了深度的隔离。如果进程中一个应用程序域失败了,剩余的应用程序域也能保持支持。

9,单个进程可以承载多个应用程序域,其中每一个程序域都和该进程(或其他进程)中其他的程序域完全彻底地隔离开来。因此,如果不使用分布式编程协议(WCF),运行在某个应用程序域中的应用程序将无法访问其他应用程序域中的任何数据(无论是全局变量和静态字段)。操作系统进程只能承载默认的应用程序域,在进程启动时,CLR将自动创建这个特定的应用程序域(默认的应用程序域),此后,CLR能够根据需求创建其他的应用程序域。如果有需要(多数.NET工作并没有这样的需求),在运行时,可以使用System.AppDomain类的静态方法在给定的进程中以编程方式创建应用程序域,该类也用于对应用程序域的低层次控制(比如加载或卸载应用程序域)。

10,应用程序域是承载.NET程序集的进程的逻辑分区,与此相似,应用程序域也可以进一步被划分成多个上下文边界(content boundary)。事实上,.NET上下文为单独的应用程序域提供了一个方式,该方式能为一个给定对象建立一个“特定的家”。使用上下文,CLR可以确保在运行时有特殊需求的对象,可以通过拦截进出上下文的方法调用,得到适当的和一致的处理。这个拦截层运行CLR调整当前的方法调用,以满足给定对象上下文的设定要求。比如,如果定义一个C#类需要自动线程安全(使用[Synchronization]特性),CLR将会在分配期间创建“上下文同步”。与进程定义默认的应用程序域一样,每一个应用程序域都有一个默认的上下文。这个默认的上下文用于组合那些对上下文没有具体的或唯一性需求的.NET对象。如果CLR判断一个新创建的对象有特殊需求,一个新的上下文边界将会在承载它的应用程序域中被创建。

11,不需要知道特定上下文的.NET对象称为上下文灵活对象。这些对象可以从承载它的应用程序域的任何位置访问,与对象的运行时需求没有关系。而那些需要上下文分配的对象称为上下文绑定对象,它们必须派生自 System.ContextBoundObject基类,这个基类表面该类对象只能在其被创建的那个上下文中正常运行。一个上下文敏感的类型可以使用特定种类的.NET特性修饰-上下文特性(派生自  System.Runtime.Remoting.Contexts.ContextAttribute基类)。

posted @ 2012-02-19 15:59  飘飘白云  阅读(1334)  评论(0编辑  收藏  举报
本博客遵循 Creative Commons License “署名-非商业用途-保持一致”创作共用协议。 与我联系