代码改变世界

4.1 所有类型都从System.Object派生

2011-12-07 10:27 by iRead, 318 阅读, 0 推荐, 收藏, 编辑
摘要:“运行时”要求每个类型最终都从System.Object类型派生。换言之,以下两个类型定义是完全一致的: 由于所有类型最终都从System.Object派生,所以可以保证每个类型的每个对象都有一组最基本的方法。具体地说,System.Object类提供了如表4.1所示的公共实例方法。 表4-1 System.Object的公共方法公共方法说明Equals如果两个对象具有相同的值,就返回true。欲知该方法的详情,请参见5.3.2节“对象相等性和同一性”GetHashCode返回对象的值的一个哈希码。如果某个类型的对象要在一个哈希表中作为key使用,该类型应使用这个方法。方法应该为不同的... 阅读全文

第4章 类型基础

2011-12-07 10:25 by iRead, 206 阅读, 0 推荐, 收藏, 编辑
摘要:本章内容:所有类型都从System.Object派生类型转换命名空间和程序集运行时的相互关系 本章将讲述使用类型和CLR时需要掌握的一些基础知识。具体地说,本章将讨论所有类型都具有的一组最基本的行为。还将讨论类型安全性、命名空间、程序集以及如何将对象从一种类型转换成另一种类型。本章最后会解释类型、对象、线程栈和托管堆在运行时的相互联系。 阅读全文

3.8 “运行时”如何解析类型引用

2011-12-07 10:17 by iRead, 502 阅读, 0 推荐, 收藏, 编辑
摘要:第2章开头展示了一下源代码:public sealed class Program{ public static void Main() { System.Console.WriteLine("Hi"); }} 编译这段代码并生成一个程序集,假定为Program.exe。运行这个应用程序时,CLR会加载并初始化它。然后,CLR读取程序集的CLR头,查找标识了应用程序入口方法(Main)的MethodDefToken。然后,CLR会检索MethodDef元数据表,找到该方法的IL代码在文件中的偏移量,把这些IL代码JIT(just-in-time,”即时”)... 阅读全文

3.7 私有部署强命名程序集

2011-12-06 10:40 by iRead, 329 阅读, 0 推荐, 收藏, 编辑
摘要:在GAC中安装程序集具有几个方面的优势。GAC使程序集能被多个应用程序共享,从而减少了总体的物理内存占用。除此之外,很容易将程序集的一个新版本部署到GAC中,并让所有应用程序都通过一个发布者策略(本章稍后讲述)来使用这个新版本。GAC还实现了对程序集的多个版本的并行管理。然而,GAC通过会受到严密保护,只有管理员才能在其中安装程序集。此外,一旦向GAC中安装,就会违反“简单复制式部署”这一宗旨。 虽然强命名程序集能安装到GAC中,但这一点绝非强求。事实上,只有在程序集要由多个应用程序共享的时候,才应该将程序集部署到GAC中。如果程序集不需要共享,就应该以私有方式部署它。私有部署维护了“简... 阅读全文

3.6 延迟签名

2011-12-06 10:31 by iRead, 290 阅读, 0 推荐, 收藏, 编辑
摘要:本章前面讲过如何使用SN.exe工具来生成公钥/私钥对。这个工具在生成密钥时,会调用Windows提供的Crypto API。密钥可存储到文件或者其他存储设备中。例如,大企业(比如Microsoft)会将自己的私钥保存到一个硬件设备中,再将这个硬件设备锁到一个保险库中。公司里只有少数几个人才能访问到私钥。这个措施可以防止私钥泄漏,并保证了密钥的完整性。当然,公钥是完全公开的,可以自由分发。 当你准备好对自己的强命名程序集进行打包时,必须使用受到严密保护的私钥对它进行签名。然而,在开发和测试程序集时,访问这些受到严密保护的私钥可能有些费事儿。有鉴于此,.NET Framework提供了对延... 阅读全文

3.5 强命名程序集能防范篡改

2011-12-05 15:02 by iRead, 348 阅读, 0 推荐, 收藏, 编辑
摘要:用一个私钥对程序集进行签名,可保证程序集是由对应公钥的持有者生成的。程序集安装到GAC时,系统对包含清单的那个文件的内容进行哈希处理,并将哈希值与PE文件中嵌入的RSA数字签名进行比较(在用公钥解除了对它的签名之后)。如果两个值完全一致,表明文件的内容未被篡改,可保证你拿到的公钥与发布者的私钥是对应的。除此之外,系统还会对程序集的其他文件的内容进行哈希处理,并将哈希值与清单文件的FileDef表中存储的哈希值进行比较。任何一个哈希值不匹配,表明程序集至少有一个文件被篡改,程序集将无法安装到GAC。重要提示:这个机制只能保证一个文件的内容没有被篡改,但无法告诉你发布者是谁,除非你对生成公钥的.. 阅读全文

3.4 在生成的程序集中引用一个强命名程序集

2011-12-05 14:55 by iRead, 504 阅读, 0 推荐, 收藏, 编辑
摘要:任何时候生成一个程序集,程序集都会包含对其他强命名程序集的引用。之所以这样说,是因为System.Object是在MSCorLib.dll中定义的,后者就是一个强命名的程序集。除此之外,在你的程序集中,还可以引用由Microsoft、第三方厂商或你自己公司开发的其他强命名程序集。第2章介绍了如何使用CSC.exe的/reference编译器开关来指定想要引用的程序集文件名。如果文件名是一个完整路径,CSC.exe会加载指定的文件,并根据它的元数据来生成程序集。如第2章所述,如果指定的是一个不包含路径的文件名,CSC.exe会尝试在以下目录查找程序集(按所列顺序):工作目录包含CSC.exe.. 阅读全文

3.3 全局程序集缓存

2011-12-02 16:44 by iRead, 2107 阅读, 0 推荐, 收藏, 编辑
摘要:了解了如何创建强命名程序集之后,接着让我们讨论如何部署它,以及CLR如何利用特定的信息来定位并加载程序集。 如果一个程序集要由多个应用程序访问,必须把它放到一个已知的目录中,而且CLR在检测到对该程序集的一个引用时,必须知道自动检查该目录。这个已知的位置称为全局程序集缓存(Global Assembly Cache,GAC)。对于.NET3.5和以前的版本,GAC通常位于以下目录(假定Windows安装到C:\Windows目录): C:\Windows\Assembly 对于.NET4.0,GAC位于以下目录: C:\Windows\Microsoft.NET\Assembly GA... 阅读全文

3.2 为程序集分配强名称

2011-12-02 11:27 by iRead, 642 阅读, 0 推荐, 收藏, 编辑
摘要:要由多个应用程序访问的程序集必须放到一个已知的目录中。另外,检测到对该程序集的一个引用时,CLR必须能自动检查这个目录。但现在的问题是:两个(或者更多)公司可能生成具有相同文件名的程序集。所以,假如两个程序集都复制到同一个移植的目录,最后一个安装的就是“老大”,造成正在使用旧程序集的所有应用程序都无法正常工作(这正是Windows的“DLL Hell”现象的根源,因为共享DLL全部被复制到System32目录中)。 显然,只根据文件名来区分程序集是不够的。CLR必须提供对程序集进行唯一性标识的机制。这正是“强命名程序集”的来历。一个强命名的程序集具有4个重要attribute,它们共同对... 阅读全文

3.9.1 发布者策略管理

2011-11-28 14:06 by iRead, 392 阅读, 0 推荐, 收藏, 编辑
摘要:在上一节的例子中,是有程序集的发布者将程序集的一个新版本发送给管理员,后者安装程序集,并手动编辑应用程序或机器的XML配置文件。通常,发布者希望在修复了程序集的一个bug之后,能采取一种容易的方式将新程序集打包并分发给所有用户。但是,发布者还需要一种方式告诉没有用户的CLR使用新的程序集版本,而不要继续使用旧版本。当然,可以指示每个用户手动修改应用程序或机器的XML配置文件,但这相当不方便,而且很容易出错。因为,发布者需要用一种方式来创建策略信息,而新程序集安装到用户机器上时,就会安装这些策略信息。本节将描述程序集的发布者如何创建这种策略信息。 假定你是一个程序集的发布者,而且刚刚创建了... 阅读全文