一、概念问题
Q:什么是.Net框架?
A:NET 框架是创建、部署和运行 Web 服务及其他应用程序的一个环境。它包括三个主要部分:公共语言运行时、框架类和 ASP.NET。
Q:什么是.Net框架?
A:NET 框架是创建、部署和运行 Web 服务及其他应用程序的一个
环境。它包括三个主要部分:
公共语言运行时、
框架类和
ASP.NET。
Q:.Net 框架可以运行于哪些平台?
A:运行在 Microsoft®XP Windows® 2000、Windows 95/98/ME 和 Windows NT® 4.0 上。
[注]另外,还有一个称为 .NET 精简框架的 .NET 框架版本。它用于使蜂窝电话和增强型电视等设备也具有 .NET 框架的某些功能。.NET 精简框架将运行在 Windows CE 和其他嵌入式操作系统上。 |
二、运行时技术问题
Q:什么是公共语言运行时 (CLR)?
A:公共语言运行时是 .NET 框架应用程序的执行引擎。
[注]非托管代码---就是没有经过CLR管理的代码,这就意味着着代码在CLR外运行,因此不能使用特定的如通用类型系统(CLS)和自动内存管理的有利功能。
|
Q:什么是公共语言规范 (CLS)?
A:公共语言规范是一组结构和限制,用作库编写者和编译器编写者的指南。它使任何支持 CLS 的语言都可以完全使用库,并且使这些语言可以相互集成。公共语言规范是公共类型系统的子集。对于那些需要编写代码供其他开发人员使用的应用程序开发人员,公共语言规范也非常重要。如果开发人员遵循 CLS 规则来设计公共访问的 API,那么就可以在支持公共语言运行时的任何其他编程语言中很容易地使用这些 API。它定义了在CLR中运行.Net应用程序可以使用的基础数据类型的长度,这意味着开发者可以避开任何支持.Net平台的任何硬件和操作系统的细节。
Q:什么是 Microsoft 中间语言 (MSIL)?
A:MSIL 是与 CPU 无关的指令集。.NET 框架程序被编译成 MSIL。它包含加载、存储、初始化和调用对象方法的指令。与元数据和公共类型系统结合,MSIL 允许真正的跨语言集成。MSIL 在执行前被转换为机器代码,而不是一边解释一边执行。
下面给出Hello,World的MSIL代码:
注解:这是配置清单 .assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z/V.4.. .ver 1:0:5000:0 } .assembly ConsoleApplication1 { .custom instance void [mscorlib]System.Reflection.AssemblyCopyrightAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyKeyFileAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyDelaySignAttribute::.ctor(bool) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyTrademarkAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyKeyNameAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyProductAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyCompanyAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyConfigurationAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = ( 01 00 00 00 00 ) // --- 下列自定义属性会自动添加,不要取消注释 ------- // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool, // bool) = ( 01 00 01 01 00 00 ) .hash algorithm 0x00008004 .ver 1:0:2130:41682 } .module ConsoleApplication1.exe // MVID: {10A3046E-3626-4479-800C-CDAA71CF23A0} .imagebase 0x00400000 .subsystem 0x00000003 .file alignment 4096 .corflags 0x00000001 // Image base: 0x07330000
注解:这是构造函数MSIL .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // 代码大小 7 (0x7) .maxstack 1 IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ret } // end of method Class1::.ctor
注解:这是Main()函数的MSIL .method private hidebysig static void Main(string[] args) cil managed { .entrypoint .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) // 代码大小 17 (0x11) .maxstack 1 IL_0000: ldstr "Hello!World" IL_0005: call void [mscorlib]System.Console::WriteLine(string) IL_000a: call int32 [mscorlib]System.Console::Read() IL_000f: pop IL_0010: ret } // end of method Class1::Main |
Q:什么是运行时编译技术?
A:编译完程序以后,MSIL代码就会保存在文件中或磁盘上,应用程序在执行之前CLR会执行一个名为运行时编译(JIT,Just-In-Time)的编译程序。CLR会使用JIT编译器来再次编译MSIL代码,然后执行编译结果,当每个方法在程序中被调用时,它会被编译,以后对相同方法的调用不需要完成同一个编译过程,因此在该过度过程中只有一个系统的开销在.Net中,当前的编译系统有三种JIT编译器:
- Pre-JIT:该JIT一次将整个配件代码编译为本地代码。通常在安装时候使用该技术。
- Econo-JIT:可以在有限的资源设备上使用该JIT。它会按比特编译MSIL代码。在需要的时候释放高速缓冲中本地代码使用的资源。
- Normal-JIT:默认的JIT,只会在其被调用并将结果本地代码存储在高速缓冲中的时候编译代码。
Q:.Net源码执行步骤?
A:编译器会将源代码转化成MSIL,MSIL不是本地语言,实际是生成包含三块数据的外壳。这个外壳称为可移植运行(PE,Portable Executable),它是用来封装Windows应用程序的二进制格式。PE外壳是一个.exe文件,有着标准的Win32可执行头。它包含一个存根,指明需要CLR来运行程序。如下图:
- 使用C#或其他任何.Net语言开发应用程序.
- 使用C#编译器(或者其他服从CLR的编译器)将源代码编译为可执行文件(.exe)文件。
- 由编译系统生成的exe文件有着标准的PE头,还包含有MSIL代码、元数据和清单。
- 当编译器创建输出的时候,它还会从mscoree.dll文件中引入一个称为_CorExeMain()的函数,这是.Net的主执行引擎,也是CLR的基础.
- 在执行的时候,操作系统装载PE和其他应用程序需要的任何DLL,如mscoree.dll以输出_CorExeMain()函数。
- 然后操作系统装载器会跳到PE的入口点,由于操作系统不能执行MSIL,入口点是一个指向_CorExeMain()函数的指针。
- 然后_CorExeMain函数会开始MSIL代码的执行。然后,由于MSIL不能直接执行,因此在处理MSIL的时候会使用一个运行时编译器(JIT)来将代码编译为本地代码,该编译器(JIT)只会在第一次调用某个函数的时候执行。
- 然后系统会执行本地代码。