1、C#与.NET的关系

  C#编译器专门用于.NET,这表示用C#编写的所有代码总是在.NET Framework中运行。对于C#语言来说,可以得出两个重要的结论:
(1)C#的结构和方法论发硬了.NET基础方法论。
(2)在许多情况下,C#的特定语言功能取决于.NET的功能,或依赖于.NET基类。
C#的重要性体现在以下两个方面:

  • 它是专门与Microsoft的.NET Framework一起使用而设计的(.NET Framework是一个功能非常丰富的平台,可开发、部署和执行分布分布式应用程序)。
  • 它是一种基于现代面向对象设计方法的语言,在设计它时,Microsoft还吸取了其他所有类似语言的经验。
    C#就其本身而言只是一种语言,尽管它时用于生成面向.NET环境的代码,但它本省不是.NET的一部分。.NET支持的一些特性,C#并不支持。而C#语言支持的另一些特性,.NET却不支持(如运算符重载)!

2、公共语言运行库

  .NET Framework的核心是其运行库执行环境,称为公共语言运行库(CLR)或.NET运行库。通常将在CLR控制性运行的代码称为托管代码(managed code)。
  但是,在CLR执行编写好的源代码(使用C#或其他语言编写的代码)之前,需要编译它们。在.NET中,编译分为两个阶段:
(1)将源代码便以为Microsoft中间代码(IL)。
(2)把CLR把IL便以为平台专用的代码。
  Microsoft中间语言与Java关键字共享一种理念:它们都是低级语言,语法很简单(使用数字代码,而不是文本代码),可以非常快速地转换为本地机器码。对于代码,这种精心设计的通用语法有很重要的优点:平台无关性、提高性能和语言的互操作性。

2.1、平台无关性

  首先,这意味着包含字节码指令的同一文件可以放在任一平台中。运行时编译过程的最后阶段可以很轻松地完成,这样底阿妈就可以运行在特定的平台上。换言之,便以为中间语言就可以获得.NET平台无关性,这与便以为Java字节码就会得到Java平台无关性是一样的。

2.2、提高性能

  实际上,IL比Java字节码的作用还要大。IL总是即时编译的(称为JIT编译),而Java字节码常常是解释性的。Java的一个缺点是,在运行应用程序时,把Java字节码转换为内部可执行代码的过程会导致心梗的损失。
  JIT编译器并不是把整个应用程序一次编译完(这样会有很长的启动时间),而是只编译它调用的那部分代码(这是其名称由来)。代码编译过一次后,得到的本地可执行程序就存储起来,直到退出该应用程序为止,这样在下次运行这部分代码时,就不需要重新编译了。
  托管IL代码几乎和本地机器代码的执行速度一样快,其原因是编译过程的最后一部分是在运行时进行的,JIT编译器确切地直到程序运行在什么类型的处理器上,可以利用该处理器提供的任何特征或特定的机器代码指令来优化最后的可执行代码。
  传统的编译器会优化代码,但他们的优化过程是独立于运行代码的特定处理器的。这是因为传统的编译器是在发布软件之前编译为本地机器可执行的代码。即编译器不知道运行代码的处理器的类型,

1.2.3、语言的互操作性

  使用IL不仅支持平台无关性,还支持语言的互操作性。简而言之,就是能将任何一种语言编译为中间语言,编译为中间语言的代码可以与从其他语言编译过来的代码进行交互操作。
(1)VB
(2)VC++

C++的一个有趣的问题是在编译成托管代码时,编译器可以生成包含在内嵌本地可执行程序的IL。这表示在C++代码中可以把关关类型和非托管类型合并起来,因此托管C++代码:

class MyClass

定义了一个普通的C++类,而代码:

ref class MyClass

生成了一个托管类,就好像使用C#或VB2012编写类一样。实际上,托管C++代码比C#代码更优越的一点是可以在托管C++代码中调用非托管C++类,而不必此阿勇COM互操作功能。
  如果在托管类型上使用使用.NET不支持的特性(例如,模板或类的多继承),编译器就会出现一个错误。另外,在使用退关类时,还需要使用非标准C++功能。
  编写使用.NET的C++程序会得到几种不同的互操作性场景。使用编译器设置/clr启用公共语言运行库支持时,就可以完全混合所有的本地和托管C++功能。其他选项可以限制C++指针的使用,从而像使用C#和VB那样编写安全的代码。
(3)COM和COM+
从技术上讲,COM和COM+并不是面向.NET的技术,因为基于它们的组件不能便以为IL(但如果原来的COM组件是用C++编写的,那么使用托管C++在某种程度上可以这么做)。但是,COM+仍然是一个重要工具,因为它包含一些.NET不具备的特性。另外,COM组件仍可以使用–.NET继承了COM的互操作性,从而使托管代码可以调用COM组件,COM组件也可以调用托管代码。一般情况下,把新组建编写为.NET组件,大多是为了方便,因为这样可以利用.NET基类和托管代码的其他优点。
(4)Windows运行库