NET Framework,一个运行在操作系统Windows之上的软件虚拟机。开发出来的程序经过编译之后,生成的可执行程序实际上包含的只是MSIL指令代码,这是一种托管代码,只能运行在.NET虚拟机之上。 托管EXE文件被调用时,Windows先加载该文件,发现其.idata部分记录了要把MSCorEE.dll加载到进程的地址空间.加载了MSCorEE.dll后,加载器获得_CorExeMain函数的地址,同时修正托管EXE中的stub函数的JMP指令。进程的主线程开始执行修正后的x86 stub函数,该函数会跳转到_CorExeMain函数上,_CorExeMain函数开始初始化CLR,并查看可执行程序集的CLR表头以确定要执行的托管入口点方法。随后IL代码被翻译成本地CPU指令。CLR跳转到编译后的本地CPU指令上,至此,托管应用程序开始真正运行。
托管EXE文件被调用时,Windows先加载该文件,发现其.idata部分记录了要把MSCorEE.dll加载到进程的地址空间.加载了MSCorEE.dll后,加载器获得_CorExeMain函数的地址,同时修正托管EXE中的stub函数的JMP指令。进程的主线程开始执行修正后的x86 stub函数,该函数会跳转到_CorExeMain函数上,_CorExeMain函数开始初始化CLR,并查看可执行程序集的CLR表头以确定要执行的托管入口点方法。随后IL代码被翻译成本地CPU指令。CLR跳转到编译后的本地CPU指令上,至此,托管应用程序开始真正运行。
java和C#其实也是解释性,只是它的解释器比较特殊,jit实际是个运行时编译器(把中间代码专成硬件指令),所以说它是编译型也说得过去。实际C#做成编译型对微软来说很容易,vb6就是一个例子,但前面已提到编译型不灵活,如果编译时已固化成硬件指令,那么象反射这样的功能就没法使用,许多反射相关的操作需要运行时动态生成代码,而.net中的许多库都大量使用反射。
http://en.wikipedia.org/wiki/Interpreted_language
其次我说的只是盖棺定论的分类结果。ngen可以看做事先解释了一遍,并不能改变.NET Framework中的C#分类为解释型语言的事实。