CLR的执行模型(续)
IL与知识产权保护
在Web应用和Web服务中,程序集是在服务器端,不可能获得,所以是安全的。
可以用非托管模块来实现需要保密的算法。
在Windows中,每个进程都有它自己的虚拟地址空间,使得一个进程无法干扰另一个进程,从而获得可靠性和稳定性。通过验证托管代码,可以确定代码不会非法访问内存,而且不会对另一个应用程序的代码产生干扰。
在单个OS进程中运行多个应用程序,可以减少进程数,减少需要的资源,从而增强性能。每个托管应用程序都称为一个AppDomain。
不安全代码unsafe
在项目“属性”中的“生成”选项,“常规”中选中“允许不安全代码”,即可使用不安全代码了。不安全代码都要放到unsafe代码块中。
在默认情况下,在用户计算机上显示安装的程序集被授予安全信任;通过内部网络或Internet执行的程序集不被授予执行不安全代码的权限。
本地代码生成器(NGen.exe)
作用:
加快应用程序的启动速度;
减小应用程序的工作集。
存在问题:
当使用反射和序列化时,需要包括IL和元数据的程序集,所以不能只发布NGen.exe生成的文件;
NGen.exe生成的文件可能失去同步,最好在更新模式中运行NGen.exe,以保持同步;
较差的加载时性能(重定位基址);
较差的执行时性能(静态字段只能间接访问,NGen到处插入代码来调用类构造器)。
通用类型系统(Common Type System CTS)
CLR是完全围绕类型展开的。
公共语言基础结构(Common Language Infrastructure CLI)一种标准
CTS规定:一个类型可以包含零个或者多个成员;制定了类型可视化规则以及类型成员的访问规则;所有类型最终必须从预定义的System.Object类型继承。
公共语言规范(Common Language Specification CLS)所有编程语言都支持的一个最小特性集
编程语言的集成是非常好的,但不同的语言存在比较大的区别,如:有些编程语言不支持unsigned、操作符重载、参数数量可变的方法,不区分大小写。
CLS的规则:在CLR中,一个类型的每个成员要么是一个字段,要么是一个方法。其它所有成员最终都要转化为字段或方法。
[assembly:CLSCompliant(true)]该属性应用于程序集,要求编译器核实在任何公开揭示的类型中,不存在任何特定的结构会防碍类型从其他编程语言中访问。
注:只有public class ,public 成员才会受编译器检查
与非托管代码的互操作性
CLR支持三种互操作情形:
1. 托管代码能调用DLL中的一个非托管函数
2. 托管代码可以使用一个现有的COM组件
3. 非托管代码可以使用一个托管类型