.net原理

来源:互联网 发布:淘宝助手上传宝贝很慢 编辑:程序博客网 时间:2024/05/22 04:40

MSIL Microsoft Intermediate Language 微软中间语言

MSIL是将.NET程序编译成机器语言的一种过程。编译成的代码不专用于任何一种操作系统,它是一种介于高级语言和基于Inter的汇编语言。每当编译程序,编译器将源代码翻译成MSIL,它是一组可以有效地转换为本机代码且独立于CPU指令。当执行这些指令时JIT将它转换为CPU的特定代码。由于MSIL支持多种JIT,所以同一MSIL代码可以被编译运行在不同的结构上。简单的说程序员就可以选择自己熟悉的语言进行编程。

MSIL包括用于加载、存储和初始化对象以及对对象调用方法的指令,还有控制流内存直接访问、异常逻辑运算。再交由JIT编译器转换为特定鱼CPU的代码。

当编译器产生MSIL时,它也产生元数据。MSIL和元数据包括在一个可移植可执行的PE文件中。



托管代码

在把代码编译成MSIL,再用JIT编译器把它编译成本机代码,CLR(托管)的任务(用.NET Framework编写的代码在执行时是托管的CLR管理着应用程序,其方式是管理内存、允许进行跨语言调试、安全性处理等不在CLR控制之下运行的应用程序是非托管的比如C++的某些代码)。C#只能在托管环境下运行代码我们使用CLR的托管功能,让.NET自己与操作系统进行交互。





应用程序域概念(Application Domain,简App Domain)

我们知道.NET程序都是运行在托管环境(managed environment),但是操作系统只提供了进程(Process),而进程呢又只是提供了内存的控制。所以我们创建的.NET程序是无法直接在进程中运行的,那怎么办呢?这个时候应用程序域作为中介的角色出现了,它能够运行非托管进程和托管进程之上所以我们的WINFROM、WENFROM,控制台应用程序或是程序集都是运行在一个应用程序域中。

单独的库程序集是不能被直接运行的(库程序集即.dll的文件),它必须和一个可执行程序集文件一起启动(可执行程序集即.exe)。当可执行文件加载完毕时,.NET会在当前进程中创建一个应用程序域称为默认域,域的名称和程序集的名称相同,它不能被销毁直至进程销毁。

那C#不是运行在托管环境下的吗?那应用程序域是允许访问加载的程序集的Net Runtime所提供的服务。

一个进程可以包涵多个应用程序域,一个应用程序域可以包涵多个程序集,那有什么好处呢?就是好处1.创建进程的开销要比创建一个应用程序域的开销要大的多,所以创建多个域在进程2.错误隔离,一个应用程序域如果崩溃,只会影响其所在的应用程序域,而不会影响其他应用程序域。

 



C# 运行机制

1.C#编写应用程序

2.把程序编译成MSIL,存储在程序集中:

3.如果是个可执行文件自动运行或在其他代码使用它时运行,将其通过JIT转换为本机代码:

4.使用托管CLR环境下运行本机代码以及其他程序过程



原创粉丝点击