C#反射与特性

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. 特性分类
  1. 系统自带特性
  2. 自定义特性
3. 创建自定义特性
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值