昨天没好好学习,今天补上。
不安全代码,这个只有在托管类的才能看到。JIT验证和编译代码的时候可以有效控制安全性。在代码执行前添加了一层果然有用,可以做很多事情。不安全代码通过两个attribute来规范用户的使用习惯。
代码的安全性是CLR的JIT来验证的,它调用被依赖的程序集的元数据来验证。input(IL code,referred assembly metadata)。
作者承认了一点C#编译出来的工程,它的知识产权其实是没有办法保障的。他提出的一种最有效的方式,让敏感的代码部分用native code实现,通过跨语言op来实现知识产权保护。
NGen.exe 是想到的预先把IL编译为native code来执行,想提高性能,节约内存,降低程序集。然后,效果未必如预期所想,它的编译看来不是全局编译,能够独立于CLR而执行的,还是得用到CLR的,这是最根本的,所以综合而言,没有那么强大。
实践下来发现大部分程序NGen.exe的性能反而慢5%。个人来看,这是NGen.exe没有做好,应该是team没有花费足够的时间和精力来做这个。毕竟普通的app,性能要求并没有那么苛刻。C#的定位不在于此。
遇到个奇怪的问题,书中前面一部分提到IL指令是typeless,后面又说CLR是围绕类型展开的,提供了CTS来作为基础映射集映射类型。
它的意思应该是IL指令的操作数是没有类型的限制?听起来也不对,验证的过程中就会验证IL指令的类型。所以综合而言,前面那一部分的描述是不准确的,IL指令也是有类型需求的。CTS是定义在IL层面的。
protected internal居然是并起来的效果(对于CTS层面的family or assembly),程序集内部或者子类可以访问。
将CLR和COM进行了对比,他们都实现了跨语言。但CLR本身是通过搭建了平台实现了跨语言,所有的语言都编译为遵循CTS,提供元数据描述,基于CLR运行的IL代码,所以能够互相调用。而COM则是一套通信标准,不同的语言通过COM协议进行通信,运行在操作系统上。虽然他们实现了相同的目标,但是走的路子不一样。现在来看,CLR更简单,容易使用。COM实在是烦外加难用的很。
CTS定义了CLR提供的所有类型,用IL汇编语言都可以实现它的所有功能。然后,高级编程语言都是暴露了CTS的部分。所有编程语言的交集就是被通用的,微软估计挑选了不少语言,然后找出了这个子集,然后把它提交去哪儿,起了个名字叫做CLS。
利用一个CLSCompliant attribute就能够检测现在的code是否符合CLS规范。它将会检查public以及protected的field,method,member以及event。
csc.exe的编译条件放在响应文件里,响应文件。。。一个大大的吐槽,这中文翻译的,也是醉了。anyway,这个文件是用来避免多次输入的,很方便的一种工具,如果不用ide,而用类似于makefile这样的东西,这个文件就有用了,不过现在开发大都用vs,估计这也就是个概念股了。
可以回忆起来,一个托管模块首先是一个PE文件,所以它有一个PE头。作为一个托管模块,它有一个CLR头,
OK,今天就看到元数据概述这儿,下一个部分元数据描述是挺重要的额一份。而现在我旁边坐了个感觉很有魅力的妹子,我心有旁骛,就早点撤退吧。勾引妹子?不行,年龄大了,小姑娘很喜欢,但是我真的自己年龄大了。给自己设置bar?这样也不好。anyway,不能这样盲目地投入感情了。撤退!