net框架运行原理
核心是CLR(通用语言运行时),
c#或者其它各种语言编译原理:将原代码通过相对的编译器(语法检查原代码分析)生成IL代码托管(IL也称托管代码),最后得到一个托管模块,一个或多个托管模块组成程序集(assembly)交给CLR运行;
编译器需要为托管模块生成完整的元数据;
元数据:是一个数据表集合,其中有描述托管模块中引用类型和成员的,还有一些描述他们中成员类型和定义的,元数据和代码一起被嵌入到EXE或者DLL中;
因此编译器同时产生元数据和IL代码,并且将它们嵌入到生成的托管模块中;
元数据在.net中的作用:
元数据省去了源代码编译时对头文件和库文件的需求,编译器可以直接从托管模块中取元数据来获得代码中包含哪些成员和所有被引用的类型;
用元数据辅助我们编写代码,.net的智能感知特性是通过分析元数据来概述我们某个类型提供了哪些方法,以及方法有哪些参数;
CLR代码验证可以用元数据确保执行的安全性;
通过元数据垃圾收集器可以追踪对象的生存期;
程序集中有一些托管模块和资源文件,通过CLR处理后在内部得到所有文件的逻辑组合关系,得到一个清单数据块,这些内容描述了组成程序集的文件;注意:程序集中还包含它所引用的其它程序集的一些信息,这些信息可以使程序集实现自描述,这样也就让CLR的执行不再到注册表中取,因此让程序集的部署要比非托管组件的部署容易得多;
安装VS08,其主要就是CLR的安装,CLR负责管理包含在程序集中的代码执行;系统文件中的mscoree.dll就代表了本机装了.NET框架;由此,我们也就知道Winform开发对于宿主机器会有.NET框架要求,因此打包安装包时要注意添加.netFrameWork作为附件安装;
当生成的是一个EXE程序集,会在编译中产生一些特殊的信息,CLR在加载程序集的时候江通过这些信息定位到应用程序的入口点方法,这样就启动了应用程序;注意非托管程序如果调用托管程序集,托管程序集DLL的入口函数也会去让CLR来处理包含在其中的代码;
mscoree.dll是负责执行程序集,指示引导如何运行.NET框架下的托管程序,
C#是高级编程语言,IL是机器语言,但不同与一般机器语言,它拥有很多高级指令,IL描述上应该讲是面向对象的机器语言;
IL汇编器ILAsm.exe 反汇编器ildasm.exe
混淆器obfuscator,而对于知识产权的保护一是尽量让托管程序和模块留在公司服务器上,向外发布就需要靠混淆器保护,另外如果混淆器还不够,就只能将一些敏感算法通过非托管模块实现;
CLR的介绍
最大的特点允许编程语言混编集成,c#的I/O能力突出,APL侧重高级工程及金融计算;
CLI(开发通用语言基础构造),CLI定义了文件格式,通用类型系统,可扩展元数据系统,中间语言和对平台底层的访问共五项标准;
CLR不能直接执行IL代码,IL代码还需要通过JIT即时编译器转换成CPU指令;
CLR的工作方式:检测代码中引用到的所有类型,分配一个内部数据结构来管理引用类型的访问;当有方法被调用时代码被即时编译验证并转换成CPU指令,并动态保存在内存中;这样,一个方法只有在首次调用时,才会产生一些性能损失,后续调用时不再进行验证转换,而命令CPU做全速执行。
微软对性能做了大量的压缩工作,因此编译器转换首次调用时性能损耗微乎其微;
FCL(.net框架类库程序集)
CTS(通用类型系统)一个关于类型的正式规范,描述了方法、属性和事件的定义,以及类型可见性和访问类型成员的规则;
CTS建立了以程序集作为类型可见性边界的规则;
IDE集成开发环境(VS.NET)自身不支持多文件程序集,(必须通过命令行工具)