C#是一门语言,是基于C风格语言(C、C++和Java)的特性而设计的。
一、C#的执行过程
1、第一步,得到C#源代码文件;
一般是.cs作为后缀(其实C#编译器允许为C#源代码文件使用任何文件扩展名)。
2、第二步,由C#编译器进行编译,得到程序集(assembly);
程序集有两种形式:一种是可执行文件.exe;另一种是类库文件.dll(Dynamic Link Library,DLL,动态链接库)。
程序集采用的是另一种语言,即公共中间语言(Common Intermediate Language,CIL),或简称为中间语言(IL),第三种说法是Microsoft IL(MSIL)。
3、第三步,再进行一次编译,CIL被转换为处理器能够理解的机器码(machine code);
由“运行时”内部的一个组件来执行从CIL到机器码的编译,这个组件称为即时编译器(just-in-time compiler,即JIT),这个过程称为即时编译或JIT编译(just-in-time compilation) 。
通常在执行时发生,也有可能在程序安装时发生。
4、第四步,代码要想执行,仅仅转换为机器码是不够的,C#程序还需要在一个代理的上下文中执行,负责管理C#程序执行的代理就是VES(Virtual Execution System,虚拟执行系统);
VES也被叫做“运行时”(runtime)(“程序执行的时候”用执行时来表示)。
CLR(公共语言运行时)正在逐渐称为运行时的一个常用代名词,这个术语更像是微软专门针对.NET平台实现的“运行时”。
“运行时”负责管理C#程序的执行,负责加载和运行程序,并在程序执行时提供额外的服务(这些服务不需要开发人员显示地编码)。
假如代码在像“运行时”这样的一个“代理”的上下文中执行,就将这些代码称为托管代码(managed code),执行过程中不需要“运行时”的代码称为本机代码(native code)或者非托管代码(unmanaged code)。
C#的底层平台是“运行时”(VES)。
5、反汇编
给定一个程序集(DLL文件或可执行文件),可以使用CIL反汇编程序将其析构成对应的CIL表示,从而查看其CIL代码。通常使用微软特有的文件名ILDASM来称呼这种CIL反汇编程序(ILDASM是IL Disassembler的简称),它能对程序或者它的类库执行反汇编,显示由C#编译器生成的CIL代码。
事实上,一些免费工具可以将CIL自动反编译成C#。
无论是否基于CLI,任何程序防止反编译唯一安全的方法就是禁止访问编译好的程序(例如,只在网站上存放程序,而不把它分发到用户机器上)。但假如目的只是减小别人获得源代码的可能性,可以考虑使用一些混淆器(obfuscator)产品。这些混淆器会打开IL代码,将代码加密成一种功能不变但更难于理解的形式。这可以防止普通开发者访问代码,使程序集难以被反编译成容易理解的代码。除非程序需要对算法进行高级安全防护,否则混淆器足矣。
二、CLI(Common Language Infrastructure,公共语言基础结构)
1、简介
CLI是在运行时管理C#程序的执行引擎。
CLI没有规定标注具体如何实现,但它描述了一个CLI平台在符合标准的前提下应该具有什么行为。
CLI标准包括以下更详细的规范:
①虚拟执行系统(VES,即常说的“运行时”);
②公共中间语言(Common Intermediate Language,CIL);支持多种语言;
③公共类型系统(Common Type System,CTS);为语言互操作性提供支持的类型系统;
④公共语言规范(Common Language Specification,CLS),包含如何编写能通过CLI兼容语言访问的库的指导原则;
⑤元数据(Metadata);
⑥公共编程框架(Framework);
⑦基类库(Base Class Library,BCL);
2、CLI实现
目前有7种主流的CLI实现(4种来自微软),各自都实现了一个C#编译器。
①Microsoft Visual C# .NET Compiler:业内最主要的编译器,但只能在Windows操作系统上运行,它作为Microsoft .NET Framework SDK的一部分免费提供给用户下载和使用;
②Microsoft Silverlight:这是CLI的一个跨平台实现,能同时在Windows和Macintosh操作系统上运行;
③Microsoft Compact Framework:.NET Framework的一个精简,设计成在PAD和手机上运行;
④Microsoft XNA:游戏开发人员使用的CLI实现,面向的是XBOX和Windows Vista;
⑤Mono Project:开源的CLI实现,提供了CLI规范及C#编译器的Windows、Linux、UNIX兼容版本;
⑥DotGNU:侧重于创建平台可移植应用程序,使其能够同时在CLI的.NET和DotGNU.Portable.NET实现下运行;
⑦Rotor:也称为Shared Source CLI,是微软开发出来在Windows、Mac OS、FreeBSD上运行的一个CLI实现;
注意每个CLI和C#编译器实现和规范相符的程度是不一的。
3、“运行时”提供的服务
如果是一个CLI实现的上下文中运行,程序员不需要直接写代码,“运行时”和托管执行提供了大量服务和功能:
①垃圾回收;
②类型安全;
③代码访问安全性(Code Access Security,CAS);
④平台可移植性;
⑤语言互操作性;
⑥BCL;