C#语言的编译过程
graph LR
C#高级语言-->编译器编译
编译器编译-->DLL/EXE
DLL/EXE-->IL
DLL/EXE-->metadata
CLR/JIT-->汇编指令/机器码
IL-->CLR/JIT
metadata-->CLR/JIT
DLL/EXE-->CLR/JIT
- DLL/EXE:都是程序编译后生成的文件
- EXE文件有程序入口可以直接执行
- DLL文件没有程序入口只能被引用(间接被执行)
- CLR/JIT:.NET平台的重要组成,实现对.NET程序的针对性优化
- CLR:通用语言运行时(Common Language Runtime),是托管程序运行的环境(内存管理、异常处理等等),可以看作是一套标准的资源,可以被任何.NET程序使用。在Windows中,整个CLR系统的实现基本其实就是几个关键的DLL,比如mscorwks.dll、mscorjit.dll,它们共同的特点就是前缀均为mscor。在程序运行初期,有操作系统将PE文件(DLL、EXE等可移植可执行文件)加载进内存然后跳至_CorExeMain中执行。分水岭就在这,当代码跳至_CorExeMain()(在mscoree.dll中)之后,程序运行进入了.NET的初始化阶段,经过一番准备工作,.NET框架便正式接管程序的运行了。
- JIT:即时编译(Just In-Time compile),这是.NET运行可执行程序的基本方式,也就是在需要运行的时候,才将对应的IL代码编译为本机指令。传入JIT的是IL代码,输出的是本机代码,所以部分加密软件通过挂钩JIT来进行IL加密,同时又保证程序正常运行。同解释执行的代码相比,JIT的执行效率要高很多。
- IL与metadata:用于描述PE文件
- MSIL:微软基于.NET平台开发的中间语言,由.NET编译器产生,是第一次编译的产物,便于CLR/JIT的工作,执行时由JIT编译为CPU对应的汇编指令
- metadata:元数据,描述.NET程序运行所必需的一切信息的数据,包括版本、类型的各个成员(方法、字段、属性、事件)等。一个文件要称为有效的.NET可执行程序,必须包含正确的元数据定义。元数据以非特定语言的方式描述在代码中定义的每一类型和成员。元数据存储以下信息:
- 程序集的说明。
- 类型的说明。
- 修饰类型和成员的其他说明性元素。
反射Reflection
反射:操作或获取metadata(元数据)
反射类Reflection:一个用来操作或获取metadata(元数据)的类库,看作是获取元数据中的类、方法、特性、属性等数据的工具,可用于DLL的动态更新以及私有成员的获取,实现通过DLL描述一个类库
1. Assembly类(程序集类)
//加载DLL
Assembly ass=new Assembly.Load("DLLName");
Assembly ass=new Assembly.LoadfILE("完整路径");
Assembly ass=new Assembly.LoadFrom("DLLName.dll"/"完整路径");
ass.GetTypes();//获取dll中的所有类型
Type type=ass.GetType("完整类型名");//获取dll中的指定类型
type.GetMethods();//获取类型中的方法
特性
特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。
通过使用特性可以向程序(元数据)添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。使用时可以看做是一个类,可以有参数和返回值。
作用:数据验证(提前说明程序某些内容的特点),贴上标签使程序有了新的功能。
1. 特性的应用场景
[AttributeUsage(AttributeTargets.All)]
public class TestAttribute : Attribute
{
}
[TestAttribute]//结构
public struct TestStruct { }
[TestAttribute]//枚举
public enum TestEnum { }
[TestAttribute]//类上
public class TestClass
{
[TestAttribute]
public TestClass() { }
[TestAttribute]//字段
private string _testField;
[TestAttribute]//属性
public string TestProperty { get; set; }
[TestAttribute]//方法上
[return: TestAttribute]//定义返回值的写法
public string TestMethod([TestAttribute] string testParam)//参数上
{
throw new NotImplementedException();
}
}
2. 特性分类
- 系统自带特性
- 自定义特性