随笔分类 - .NET CLR
摘要:2.1 .NET Framework部署目标 非.NET程序的问题: 1.DLL hell 2.安装复杂。目录分散,注册表,快捷方式 3.安全性。悄悄下载恶意代码 2.2 将类型集成到模块中——编译器工具csc csc /out:Program.exe /t:exe /r:Mscorlib.dll ...
阅读全文
摘要:术语:CLR :Common Language Runtime 公共语言运行期,有多种不同编程语言使用的运行库托管模块:Managed Module,一个标准的MS Window可移植执行体文件(32位PE32或64位PE32+) IL:Intermediate Language 中间语言,又叫托管代码(由CLR管理它的执行)元数据:metadata,一系列特殊的数据表程序集:Assembly,抽...
阅读全文
摘要:重载操作符 要求重载方法的参数至少有一个参数与重载方法的类型一样。 运算符参数不能使用ref/out修饰符。 需许要注意的要点如下: &&和||不能被直接重载,但使用&和|进入计算则可以被重载 [ ]不能被重载,可以使用索引器来代替它完成所需操作 ( )不能被重载,代替此运算符的方式是定义新的转换运算符 ,即隐式/显示转换运算符 逻辑运算符必须成对重载==和!=...
阅读全文
摘要:1.Class的可见性有public和internal两种,public对所有程序集都可见,internal仅对其所在的程序集可见。默认是internal的。2.友元程序集,使用friend assembly可以实现单元测试,而不使用反射技术。书上讲的是按照命令行编译。我测试用的是vs2005的solution,如下:3.成员的可访问性成员默认是private的,接口类型的成员都是public的。...
阅读全文
摘要:1.实例构造器ctor(引用类型) 创建引用类型的实例时的步骤: 首先,为实例的数据字段分配内存; 接着,初始化对象的系统开销字段(类型对象指针和同步块索引); 最后,调用类型的实例构造器设置对象的初始状态。 ctor不能被继承,不能用virtual,new,override,sealed,abstract。 如果类中没...
阅读全文
摘要:1.常量 常量是永远不会改变的符号。它的值必须在编译时就确定。编译后,CLR将常量的值保存在Assembly的元数据中,这意味着常量必须是基元类型。 常量是类型的一部分,总是被当成静态成员,但并不显示声明为static。 public const Int32 MaxEntriesList = 100; 当代码引用常量时,CLR在元数据中查找该符号,将提取的常...
阅读全文
摘要:属性分两种,无参属性,有参属性,后者又叫索引器(indexer)——VB.NET中相应为默认属性。 1.无参属性 CLR支持静态属性,实例属性,抽象属性,虚拟属性,但不能被重载。 属性在MSIL中生成以下内容: get_XX方法,当在属性中定义了get的时候——XX为属性名 set_XX方法,当在属性中定义了set的时候——XX为属性名 一个位于原数据中的属性定义。 属...
阅读全文
摘要:事件也是方法。 定义一个事件成员意味着类型具有三种能力: *类型的静态方法/实例方法可以订阅类型事件 *类型的静态方法/实例方法可以注销类型事件 *事件发生时通知已订阅事件的方法 .NET2.0的事件仍然是基于Win32的,只不过使用了Observer模式来实现,同时建立在Delegate机制之上。 事件的设计步骤如下(基本上是Observer的实现步骤): 10.1...
阅读全文
摘要:1.NET组件的层次: 2.获取元数据,以下3个方法分别获取Type,Event,Properties的元数据: 对于Type,通过TypeDescriptor静态类,获取其默认事件,默认属性,以及该类型所带的所有Attribute(通过枚举取得) 可以通过TypeDescriptor.GetEvents静态方法获取事件集合EventDescriptorCollection,遍...
阅读全文
摘要:1.Attribute,属性(特性),又名元数据,自定义属性。编译期会解释属性,并将对应的标志插入到IL中。 AOP:面向方面的编程,以声明性的方式控制属性。 .NET已有的属性类: 1)Serializable: 仅可用于Class/Struct/Enum/Delegate 2)NotSerialized:仅用于字段 3)AssemblyVersion:仅用于程序...
阅读全文
摘要:第一部分 动态程序集加载 1.创建程序集引用:分2种 全面引用:以引用程序集名称,版本,文化以及公钥标记的方式,进行加载——首选,避免DLL Hell。静态引用的程序总是全部引用 部分引用:只使用程序集名称,而忽略其他所有属性,进行加载。 .Net如何找到要加载的DLL: 首先,运行时要分析应用程序配置文件,包括以下3个级别: ...
阅读全文
摘要:本章是上一章的继续,再获取到对象类型后,接下来做的事情。 第一部分 动态调用成员——调用方法,检索或更改属性,以及字段 方法1:利用Info类调用类成员 1.用MethodInfo类调用方法: object[] Invoke(object obj, Object[] parameters) 其中,第1个参数obj,是对象的实例...
阅读全文
摘要:第一部分:程序集(System.Reflection.Assembly) 1.获取Assembly对象 方法1:调用Assembly的以下4个静态方法Get...()之一: GetAssembly(Type t) GetCallingAssembly() ——返回调用当前方法的方法所在的程序集 GetExecutingAssembly() —...
阅读全文
摘要:1.反射的定义: 反射是在运行时动态分析,操纵和创建对象的机制。——3个功能,依次在以下章节分析。 反射要访问存储于.NET程序集中的元数据,以发现原始代码方面的信息。 2.反射的后期绑定区别于C#中的后期绑定。 C#中采用override方法进行后期绑定——编译期间确定使用那个方法。 反射没有这个限制,直到运行期间才会确定。反射还可以绑定程序集和类型,根据元数据...
阅读全文
摘要:Object o1 = new Object(); Object o2 = new B(); Object o3 = new D(); Object o4 = o3; B b1 = new B(); B b2 = new D(); D d1 =...
阅读全文
摘要:1.Delegate是类型安全的,也就是说,在编译期可以检测出错误;而与之相似的Reflection是类型不安全的。 Delegate是方法地址的指针,而且不区分static和instance方法。 Delegate是定义在Class之外的,这个平级的Class中包括Delegate要使用的方法。 2.Delegate允许引用类型的协变(covariance)和反协变(contra-...
阅读全文