.NET编译时都做了一些什么

编译

================================================================<br>
FAQ - 一个.NET程序在编译和运行时都做了些什么?<br>
================================================================<br>
在新闻组和邮件列表里有大量关于一个.Net程序的设计编译(design-time or<br>
run-time)和运行原理 (CPU-specific binary or pseudo-code)的疑问。<br>
<br>
这里是一个简单的回答:当你编译一个C#应用程序或任何一种CLS(Commmon<br>
Language Specification)兼容的语言时,它将首先被编译成一种称为IL<br>
(Intermediate Language)的伪代码(pseudo-code)。在这个应用程序第一次<br>
被运行的时候,这种IL代码将被编译成机器代码,用于执行。也就是说从源代码<br>
到得到运行结果,进行了两次编译。事实上,只有那些被真正使用的函数代码<br>
才会被进行第二次编译。下面揭示开发过程中被隐藏起来的细节:<br>
<br>
1) 你用C#开发一些程序<br>
2) 用C#编译器或CLS兼容的编译器编译成EXE<br>
3) 编译器将生成的IL代码和附加信息(manifest)放入拥有一个标准PE头的Win32<br>
   可执行文件的只读部分。<br>
4) 编译器在创建这个可执行文件时导入(import)一个名为_CorExeMain的函数。<br>
   这个函数是.NET EE(execution engine)--.NET运行期引擎的入口函数。<br>
5) 当执行这个Win32可执行文件时,因为其主要是依赖于DLL的PE文件,操作系<br>
   统将会调用位于MSCorEE.DLL中的_CorExeMain函数。<br>
6) 操作系统通过PE文件里的进入点,调用MSCorEE.DLL。并能保证在Windows里<br>
   可以有很多程序同时运行。<br>
7) 因为操作系统不能执行.NET IL代码,EXE里的进入点只是简单的中介,它将<br>
   指示操作系统调用_CorExeMain函数。<br>
8) 随后_CorExeMain函数开始解释位于PE文件中的IL代码。<br>
9) 因为IL是不能被直接执行的, .NET EE使用称为JITter (Just In Time compiler)<br>
   的即时编译器将IL代码编译成本地CPU机器代码用于执行。这一即时编译过程<br>
   只在第一次执行的时候进行。

时间: 2024-11-19 21:31:53

.NET编译时都做了一些什么的相关文章

c++在编译期间都做了些什么

问题描述 c++在编译期间都做了些什么 看了这张ppt之后,很好奇编译期间都做了哪些工作1.是不是不同的编译器不一样的?如果不一样就讲讲主流的像vs这样的吧(zl一直用vs,不知道大神有更好的推荐吗)2.const 在编译期间就被赋值了,有没有其他变量也是在编译期间赋值?全局变量?静态变量?宏?3.主要还是讲讲编译的时候几个步骤吧请大神讲的详细一点!不胜感激! 解决方案 找一个idapro,反编译生成的exe,可以很直观地看到编译器做了什么.你的ppt上说的那些只是语言规范,和编译器怎么实现的不

精品赏析:一个.NET程序在编译和运行时都做了些什么?

编译|程序 一个.NET程序在编译和运行时都做了些什么?================================================================在新闻组和邮件列表里有大量关于一个.Net程序的设计编译(design-time orrun-time)和运行原理 (CPU-specific binary or pseudo-code)的疑问. 这里是一个简单的回答:当你编译一个C#应用程序或任何一种CLS(CommmonLanguage Specificati

opengl 纹理 球-opengl在mfc中载入一副BMP文件作为纹理,编译链接都通过了但运行时就提示停止工作

问题描述 opengl在mfc中载入一副BMP文件作为纹理,编译链接都通过了但运行时就提示停止工作 HBITMAP hBMP;//定义BMP头BITMAP BMP;//BMP结构体//byte Texture[]={IDB_BITMAP3};byte Texture[]={IDB_BITMAP4};glGenTextures(sizeof(Texture) &texture[0]);// Generate 6 Textures (sizeof(Texture)=6 ID's)for(int lo

目录中有glut32.dll文件,程序执行时却提示找不到glut32.dll,这是为什么啊?(顺便说一下,编译连接都没问题)

问题描述 我在vc中编写opengl的一个简单程序,编译.链接时都没问题,但执行的时候却提示没有找到glut32.dll文件,可是在lib目录下明明有这个文件,为什么说找不到呢?我的积分不多只能给这么点了,请各位大侠帮忙指点一下...谢谢! 解决方案 解决方案二:把文件复制到你程序的目录下解决方案三:有没有设置好VC默认的文件查询途径???

c++\clr 拿vs 2013 编译怎么 。net 运行时都是 4.0的?

问题描述 是我项目用上了std::shared_ptr的原因吗?但是就算是什么都没写引用的类库编译出来都是4.0的, 解决方案 解决方案二:vs2013default用NET4可以在ProjectProperty里改TargetFramework解决方案三:默认就是4.0,需要改的话要手工改vcproj文件解决方案四:就算设为.net2.0编译出来还是4.0解决方案五:你是怎么设置目标框架的,你又是怎么判断编译出来还是.net4.0的.

运行时和编译时元编程—运行时元编程

原文链接   译文链接   译者:JackWang 运行时和编译时元编程 第一部分 Groovy语言支持两种风格的元编程:运行时元编程和编译时元编程.第一种元编程支持在程序运行时修改类模型和程序行为,而第二种发生在编译时.两种元编程有各自的优缺点,在这一章节我们将详细讨论. 注:译者也是第一次接触Groovy,由于时间和水平有限(姑且让译者使用这个理由吧,对待知识本应该一丝不苟)部分专有名词可能翻译不准确甚至有误(读者阅读的过程中最好能参考原文),恳请读者不吝留言指出,谢谢! 1.运行时元编程

编译时标签(对JSP进行的XSLT预处理)

js|编译 一篇旧文,翻出来回顾一下.BTW,抗议csdn的分类,XML怎能归于.NET之下!! 发信人: HAX(海曦), 信区: WebDevelop 标 题: 发信站: 饮水思源 (2002年02月12日00:10:32 星期二), 站内信件 编译时标签(对JSP进行的XSLT预处理) 原文:http://www.mail-archive.com/taglibs-dev@jakarta.apache.org/msg00390.html From: James Strachan Subjec

编译时找不到xxx.pch

Unexpected end while looking for precompiled header这时因为该模块没有包括预编译头文件"stdafx.h"的缘故. VC用一个stdafx.cpp包含头文件stdafx.h,然后在stdafx.h里包含大部分系统头文件,这样编译时VC就通过编译stdafx.cpp把大部分系统头文件预编译进来了,在Debug目录下有一个很大的文件*.pch,这里就存储了预编译信息. 根据这个原理,如果这个pch损坏了或被删除了,系统重新编译时就会抱怨&q

实现一个简单的Java编译时注解处理器

简介 Java注解又称Java标注,是Java语言5.0版本开始支持加入源代码的特殊语法元数据.Java语言中的类.方法.变量.参数和包等都可以被标注.Java标注和Javadoc不同,标注有自反性.在编译器生成类文件时,标注可以被嵌入到字节码中,由Java虚拟机执行时获取到标注.根据元注解@Retention指定值的不同,注解可分为SOURCE.CLASS和RUNTIME三种类型.当被声明为SOURCE时,注解仅仅在源码级别被保留,编译时被丢弃:声明为CLASS时,注解会由编译器记录在clas