.NET程序的编译和运行
程序的编译和运行,总得来说大体是:首先写好的程序是源代码,然后编译器编译为本地机器语言,最后在本地操作系统运行。
下图为传统代码编译运行过程:
.NET的编译和运行过程与之类似,首先编写好的源代码,然后编译为微软中间语言代码,运行的时候即时编译为本地机器语言,同时.NET代码运行时有一个CLR环境来管理程序。如下图为.NET代码编译运行过程:
下面详细介绍下编译运行时的一些概念。
1.MSIL和JIT
在编译使用.NET 框架创建的代码时,不是立即创建操作系统特定的本机代码,而是把代码编译为微软中间语言(Microsoft Intermediate
Language,MSIL)代码,这些MSIL代码不专用于任何一种操作系统,也不专用于任何一种语言,有些类似于JAVA的字节码。C#及其他.NET语言,如VB.NET在编译阶段都编译为这种语言。
因为代码在编译阶段没有直接编译成本机代码,所以在执行应用程序时,必须完成更多的工作,这就是Just—In-Time(JIT)编译器的任务。
JIT把MSIL编译为专用于某种操作系统和目标机器结构的本机代码,只有这样,操作系统才能执行应用程序。这里编泽器的名称Just—In—Time,反映了MSIL仅在需要时才编译的特性。
过去,常常需要把代码编译为几个应用程序,每个应用程序用于特定的操作系统和CPU结构,这通常是一种优化形式(例如,为了让代码在AMD芯片上运行将更快),但更多时候是必须的(例如分别运行在Windows和Linux操作系统上)。现在就不必要了,顾名思义,JIT编译器使用MSIL代码,而MSIL代码是独立于机器、操作系统和CPU的。目前有几种JIT编译器,每种编译器都用于不同的结构,我们总能找到一个合适的编译器创建所需的本机代码。这样,用户需要做的工作就比较少了,实际上,用户不必考虑与系统相关的细节,只需要把注意力放在代码的功能上就足够了。
2.程序集
在编译应用程序时,创建的MSIL代码存储在一个程序集中,程序集包括可执行的应用程序文件(这些文件可以直接在Windows上运行,不需要其他程序,其扩展名为.exe)和其他应用程序使用的库(其扩展名是.dll)。
除了包含MSIL外,程序集还包含元数据(即程序集中包含的数据信息)和可选的资源(MSIL使用的其他数据,例如声音和图片文件)。在程序集包含的所有文件中,有一个文件用于保存清单。(清单是元数据部分中一组数据表的集合,其中包含了程序集中一部分文件的名称,描述了程序集的版本,语言文化,发布者,共有导出类型,以及组成该程序集的所有文件)。需要注意的是一个程序集只能一个程序清单。
元数据允许程序集是完全自我描述的,不需要其他信息就可以使用程序集。也就是说,我们不再需要把应用程序所需要的数据添加到系统注册表中,因此,部署应用程序就非常简单了,只需把文件复制到远程计算机中的目录下即可。
当然,不必把运行应用程序所需要的所有信息都安装到一个地方。我们可以编写一些程序集,执行多个应用程序所要求的任务。此时,通常把这些可重用的程序集放在所有应用程序都可以访问的地方。在.NET
框架中,这个地方是“全局程序集高速缓冲存储器”(Global Assembly cache),有相应的工具可以帮助把程序集放在高速缓冲存储器中。
http://hovertree.com/menu/csharp/
3.托管代码
在把代码编译为MSIL,再用JIT编译器把它编译为本机代码后,CLR的任务还没有完全完成。用.NET
框架编写的代码在执行时是托管的,即CLR管理着应用程序,其方式是管理内存、处理安全性,以及允许进行跨语言调试等。相反,不在CLR控制之下运行的应用程序是非托管的,某些语言如C++可以用于编写这类应用程序,例如,访问操作系统的低级功能。使用C#主要编写在托管环境下运行的代码,它们使用CLR的托管功能,让.NET自己与操作系统进行交互,当然也可以编写在非托管环境下运行的代码,但需要特别标注。托管代码的优点有:1、平台无关性,2、提高性能,3、语言的互操作性。
4.垃圾回收
托管代码最重要的一个功能是垃圾回收(Garbage
Collection),它可确保应用程序不再使用某些内存时,这些内存就会被完全释放。在.NET推出以前,这项工作主要由程序员负责,代码中的几个简单错误会把大块内存分配到错误的地方,使这些内存神秘失踪。这通常意味着计算机的速度逐渐减慢,最终导致系统崩溃。
.NET无用存储单元收集器会频繁检查计算机内存,从中删除不再需要的内容。它可能一秒钟内会进行上千次的检查,也可能几秒钟检查一次,或者随时进行检查,但可以肯定的是进行了检查。
5.应用程序域
在以前传统的开发中我们都知道,一个应用程序对应一个进程,并为该进程指定虚拟内存,由操作系统来映射实际的物理内存,有效的维护了进程之间的安全性。但另一方面,每一个进程都会消耗一定的系统资源,降低了性能,并且进程间的通信也比较麻烦。
在.Net中推出了一个新的概念:应用程序域(AppDomain)。可以理解成很多应用程序域都可以运行在同一个.NET的进程中,可以降低系统消耗,同时不同的域之间互相隔离,在安全性方面有保障。另外对于同一个进程内不同域之间的通信也相对简单一点。
转自:http://hovertree.com/h/bjaf/i550eyyq.htm
推荐:http://www.cnblogs.com/roucheng/p/3521864.html
.NET程序的编译和运行的更多相关文章
- DOS环境下含包并引用第三方jar的java程序的编译及运行
DOS环境下含包并引用第三方jar的java程序的编译及运行 1.程序目录机构 bin:class文件生成目录 lib:第三方jar包目录 src:源程序文件目录 2.程序代码: 3.程序编译 jav ...
- Java与C++程序在编译和运行上的区别
Java.C++都属于高级语言,而计算机能认识执行的只是机器码(即二进制),所以高级语言都必须经过直接或间接的转换成汇编以后,才能运行: 对于C/C++这类高级计算机语言,它们的编译器(例如Unix下 ...
- Linux下C程序的编译,运行,及调试
先查看linux有没有gcc 和 gdb $ gcc -v $ gdb -v 如果没有安装gcc,可以 $ yum install gcc 要获取管理员权限才能安装软件,$ su root (有的li ...
- java 应用程序的编译和运行
1.java 文件的编译和执行步骤. 第一步:使用编辑器编辑 后缀为java的文件,里面包含主类(包含 main()函数), 源文件的命名规则是,如果源文件中有多个类,那么只能有一个类是public ...
- C程序从编译到运行
第一篇文章 一.前言 最近在看CSAPP(深入理解计算机系统)然后以前也学过C语言,但是从来没有深究写好的C代码是怎么编译再到执行的. 所以现在自己学习,然后记录下来. 以最常用的hello worl ...
- .NET概念:.NET程序编译和运行
.NET概念:.NET程序编译和运行 分类: c#程序设计 2012-02-29 15:46 3001人阅读 评论(2) 收藏 举报 .net编译器语言microsoftassemblyvb.net ...
- Java程序编译和运行的过程
Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程. 如下图,Java程序从源文件创建到程序运行要经过两大步骤:1.源文件由编译器编译成字节码(ByteCode) 2 ...
- Java程序编译和运行的过程【转】
转自:http://www.360doc.com/content/14/0218/23/9440338_353675002.shtml Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来 ...
- .NET程序编译和运行
一次面试的时候遇到的一道题目,简要说明.NET的编译过程,在网上看了很多资料,简单总结如下: 1.一般的编译过程 通常高级语言的程序编译过程是:首先写好的程序是源代码,然后编译器编译为本地机器语言,最 ...
随机推荐
- ASP.NET MVC学习系列(二)-WebAPI请求
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...
- bash的循环中无法保存变量
在bash中,如果循环在一个子shell中运行,那么在循环中对循环外面的变量的更改将在循环退出后不可见.像下面的例子: #!/bin/sh python run.py | while read lin ...
- dapper 操作类封装
using System; using System.Collections.Generic; using System.Data; using System.Data.SQLite; using S ...
- Swift 关键字汇总
常见的关键字有以下4种 与声明有关的关键字:class.deinit.enum.extension.func.import.init.let.protocol.static.struct.subscr ...
- 点击弹出 +1放大效果 -- jQuery插件
20140110更新: <!doctype html> <html> <head> <meta charset="UTF-8"> & ...
- android dalvik heap 浅析
android 系统中可以在/system/build.prop中配置dalvik堆的有关设定.具体设定由如下三个属性来控制 -dalvik.vm.heapstartsize 堆分配的初始大小,调整 ...
- WIN7 64位如何添加网络打印机
http://wenku.baidu.com/view/2d64bef0f61fb7360b4c65ac.html 该文介绍的比较详细,并且我按照他的方法,确实安装成功了.
- [转]MySQL与MongoDB的操作对比
MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方 ...
- C#基础总结之二循环控制-运算符
#region 第二天 作业2 从键盘上输入三个数,用if语句和逻辑表达式把最小数找出来. //需要:控制台输入 三个变量(a,b,c)判断这三个数其中一个最小的值 打印输出 //Console.Wr ...
- [转]查看手机已经记住的WIFI密码
有时用过wifi后记住密码了,但再想知道wifi密码是多少,怎么办呢.下面的方法为你解决这样的问题. 1.手机必须取得root权限. 2.用RE管理器或es文件浏览器进入data/misc/wifi, ...