http://msdn.microsoft.com/en-us/library/k5532s8a.aspx
执行托管代码的过程包括下列步骤:
-
选择编译器。
为获得公共语言运行时提供的优点,必须使用一个或多个针对运行时的语言编译器。
-
将代码编译为 MSIL。
编译将源代码翻译为 Microsoft 中间语言 (MSIL) 并生成所需的元数据。
-
将 MSIL 编译为本机代码。
在此编译过程中,代码必须通过验证过程,该过程检查 MSIL 和元数据以查看是否可以将代码确定为类型安全。
-
运行代码。
公共语言运行时提供使执行能够发生以及可在执行期间使用的各种服务的基础结构。
具体细节:
-
选择编译器
使用一个或多个针对运行时的语言编译器,如 Visual Basic、C#、Visual C++、F# 或许多第三方编译器(如 Eiffel、Perl 或 COBOL 编译器)中的一个。
编写符合 CLS 的代码。
-
编译为 MSIL
由于公共语言运行时为它支持的每种计算机结构都提供了一种或多种 JIT 编译器,因此同一组 MSIL 可以在所支持的任何结构上 JIT 编译和运行。
运行时在执行过程中根据需要从该文件中查找并提取元数据。
.NET Framework 提供了两种方式来执行此类转换:
-
.NET Framework 实时 (JIT) 编译器。
-
Ngen.exe (Native Image Generator).
使用 JIT 编译器进行编译
但是,如果托管代码调用特定于平台的本机 API 或特定于平台的类库,则将只能在该操作系统上运行。
这样,对 JIT 编译的方法的后续调用将直接转到该本机代码。
使用 NGen.exe 的安装时代码生成
略。
代码验证
它还提供了对代码可以可靠地强制安全限制的保证。
运行时使用下列条件来验证代码是否为类型安全:
-
对类型的引用与被引用的类型严格兼容。
-
在对象上只调用正确定义的操作。
-
标识与声称的要求一致。
如果安全策略要求提供类型安全代码,而该代码不能通过验证,则在运行该代码时将引发异常。
-
运行代码
这种进行 JIT 编译然后运行代码的过程一直重复到执行完成时为止。
在执行过程中,托管代码接收若干服务,这些服务涉及垃圾回收,安全性,与非托管代码的互操作性,跨语言调试支持,增强的部署,以及版本控制支持等。
_CorValidateImage 执行下列操作:
-
确保代码是有效的托管代码。
-
将映像中的入口点更改为运行时中的入口点。
_CorValidateImage 会修改内存中的映像,将其从 PE32 格式转换为 PE32+ 格式。