那部分代码(这是其名称由来)。代码编译过一次后,得到的内部可执行代码就存储起来,直到退出该应用程序为止,这样在下次运行这部分代码时,就不需要重新编译了。Microsoft认为这个过程要比一开始就编译整个应用程序代码的效率高得多,因为任何应用
程序的大部分代码实际上并不是在每次运行过程中都执行。使用JIT编译器,从来都不会编译这种代码。
这解释了为什么托管IL代码的执行几乎和内部机器代码的执行速度一样快,但是并没有说明为什么Microsoft认为这会提高性能。其原因是编译过程的最后一部分是在运行时进行的,JIT编译器确切地知道程序运行在什么类型的处理器上,利用该处理器提供的任何特性或特定的机器代码指令来优化最后的可执行代码。
传统的编译器会优化代码,但它们的优化过程是独立于代码所运行的特定处理器的。这是因为传统的编译器是在发布软件之前编译为内部机器可执行的代码。即编译器不知道代码所运行的处理器类型,例如该处理器是x86兼容处理器或Alpha处理器,这超出了基本操作的范围。例如Visual Studio 6优化了一台一般的Pentium机器,所以它生成的代码就不能利用Pentium III处理器的硬件特性。相反,JIT编译器不仅可以进行Visual Studio 6所能完成的优化工作,还可以优化代码所运行的特定处理器。
3. 语言的互操作性
不仅支持平台无关性,还支持语言的互操作性。简言之,就是能将任何一种语言
编译为中间代码,编译好的代码可以与从其他语言编译过来的代码进行交互操作。
那么除了C#之外,还有什么语言可以通过.NET进行交互操作呢?下面就简要讨论其他常见语言如何与.NET交互操作。
VB.NET
在升级到Visual Basic .NET时,经历了一番脱胎换骨的变化。Visual Basic是在最近的几年中演化的,其早期版本Visual Basic 6并不适合运行.NET程序。例如,它与COM的高度集成,且只把事件处理程序作为源代码显示给开发人员,大多数后台代码不能用作源代码。另外,它不支持继承,Visual Basic使用的标准数据类型也与.NET不兼容。
Visual Basic 6已经升级为Visual Basic .NET,对VB进行的改变非常大,完全可以把Visual Basic .NET当作是一种新语言。现有的VB6代码不能编译为VB.NET代码,把VB6程序转换为VB.NET时,需要对代码进行大量的改动,但大多数修改工作都可以由Visual Studio .NET(VS的升级版本,用于与.
NET一起使用)自动完成。如果要把一个VB6项目读取到Visual Studio .NET中,Visual Studio .NET就会升级该项目,也就是说把VB6
源代码重写为
VB.NET源代码。虽然这意味着其中的工作已大大减轻,但用户仍需要检查新的VB.NET代码,以确保项目仍可正确
工作,因为这种转换并不十分完美。
这种语言升级的一个副作用是不能再把VB.NET编译为内部可执行代码了。VB.NET只编译为中间语言,就像C#一样。如果需要继续使用VB6编写程序,就可以这么做,但生成的可执行代码会完全忽略.NET Framework,如果继续把Visual Studio作为开发环境,就需要安装Visual Studio 6。
Visual C++ .NET
有许多Microsoft对Windows的特定扩展。通过Visual C++ .NET,又加入了更多的扩展内容,来支持.NET Framework。现有的C++源代码会继续编译为内部可执行代码,不会有修改,但它会独立于.NET运行库运行。如果要让C++代码在.NET Framework中运行,就要在代码的开头添加下述命令:
#using
还要把标记/clr传递给编译器,编译器假定要编译托管代码,因此会生成中间语言,而不是内部机器码。C++的一个有趣的
问题是在编译托管代码时,编译器可以生成包含内嵌本机可执行代码的IL。这表示在C++代码中可以把托管类型和非托管类型合并起来,因此托管C++ 代码:
class MyClass
{
定义了一个普通