我们知道.net上运行的所有程序在编译时候都会先编译成一种“中间语言”,我想问的就是,能否将C#代码,编译成脱离.net运行环境的机器码?
參考答案:很抱歉,这是不可能的。C#语言程序不可能脱离.net框架,就像Java一样,C#语言的运行环境是.net framework,.net对于C#就像Java虚拟机对于Java语言一样。另外,C#是一种有限制语言,.net负责保证代码访问的安全特性,C++是唯一可以允许程序员开发无限制低级程序的语言,.net不仅负责为代码提供运行支持,还负责保证程序的安全性,一种受限制的语言是不能脱离限制程序的控制的,对于C#,.net就是控制系统,因此,C#程序不可能脱离.net环境。
===================================================
对补充的答复:
这恐怕也是不行的。在以往的PE结构的程序中,因为不同的CPU拥有不同的指令集,所以为了适应客户机的硬件的不同,往往会开发一个程序的不同版本,微软为了解决这个问题,在.net中准备了多个即时编译器(JIT),当一个中间语言的程序在客户机上运行时,JIT会根据客户机当前的硬件配置和操作系统等方面的情况对代码进行优化,然后生成本地化的机器代码,这个机器代码并不是全部程序的代码,而是只生成程序运行必须的部分,其它的会在执行时根据需要动态生成。微软官方对项技术的解释为:
“JIT 编译考虑了在执行过程中某些代码可能永远不会被调用的事实。它不是耗费时间和内存将可移植可执行 (PE) 文件中的所有 MSIL 转换为本机代码,而是在执行期间根据需要转换 MSIL 并存储生成的本机代码以供后继的调用使用。当加载类型时,加载器创建存根 (stub) 并将其附加到类型的每个方法。当对方法进行初始调用时,存根 (stub) 将控制传递给 JIT 编译器,而编译器将该方法的 MSIL 转换为本机代码并修改存根 (stub) 以直接执行到本机代码的位置。后面对 JIT 编译的方法的调用将直接进行到以前生成的本机代码,从而减少了进行 JIT 编译和运行代码所需的时间。”(原文)
此外,当一个程序开始运行后,JIT首先开始进行即时编译,当某个被编译过的方法被再次执行时,将直接执行它的本地代码。
希望这些信息对您有所帮助。