随笔分类 -  .NET CLR

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