zoukankan      html  css  js  c++  java
  • Unity3D中的Attribute详解(二)

    上一篇文章我们初步了解了一下Attributes的含义,并且使用系统自带的Attributes写了点代码。在进一步解剖我们的代码之前,我觉得有个概念可能需要巩固一下:什么是元数据?

    我们知道C#代码会被转成MSIL中间语言,而在IL中,程序集的元数据(Metadata)是指以文本的形式保存的该程序集里所有命名空间,类,类中的成员等等。我们可以使用反射的技术把元数据读取出来,还原成IL中代码的树状图。通过反编译,能够基本上还原出代码原来的样子。

    如果英文够好的话,可以看看StackOverFlow上的这篇问答。

    https://stackoverflow.com/questions/8861065/what-is-metadata-in-net

    目前我们已经能够写Attribute,并且使用它来做一些事情。下面我们用MSIL的反编译器看下Attribute的实质是什么。

    这个反编译叫ildasm.exe,定位代码到C盘

    C:\Program Files (x86)\Microsoft SDKs\Windows\

    然后选择版本最高的一个文件夹,定位到

    C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\文件夹下面。

    可以直接双击,也可以右键发送到桌面方便使用。

    打开我们上一篇代码的exe文件,可以看到:

    MSIL的树形结构非常清晰,从命名空间到类名以及方法的名字,其中.ctor是默认的构造函数。我们并没有在树状结构中发现Attribute的踪迹。随便双击一个加了Attribute的方法,可以得到代码如下:

    .method public hidebysig static void  LogEngineLow() cil managed
    {
      .custom instance void [mscorlib]System.Diagnostics.ConditionalAttribute::.ctor(string) = ( 01 00 03 4C 6F 77 00 00 )                         // ...Low..
      .custom instance void [mscorlib]System.Diagnostics.ConditionalAttribute::.ctor(string) = ( 01 00 06 45 6E 67 69 6E 65 00 00 )                // ...Engine..
      // 代码大小       13 (0xd)
      .maxstack  8
      IL_0000:  nop
      IL_0001:  ldstr      "LogEngineLow"
      IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
      IL_000b:  nop
      IL_000c:  ret
    } // end of method ToolKit::LogEngineLow

    在方法中,执行代码之前(IL_0000-IL000c),我们看到了两个构造方法的调用,而这两个构造方法的调用类正是ConditionalAttribute!

    再次观察IL代码,可以看到.custom字段,这是专门用来声明自定义的Attributes的。

    至此,和我们在第一篇文章中的猜测完全吻合,这是一个类的造型怪异的构造函数。而微软设计这么诡异的语法,我猜测也是为了能够和方法内的代码区分开来,达到低耦合的效果。当代码编译成MSIL的时候,Attributes的构造函数会自动移到目标空间的代码段里,这样看起来就是很正常的代码了。

    如果你双击了MSIL中的MANIFEST,就会看到如下的代码:

    其实系统自己就调用了很多的Attributes。

    我们对IL代码的研究暂时告一段落,下一篇文章将写一个属于自己的Attribute。

  • 相关阅读:
    剑指63.数据流中的中位数
    剑指62.二叉搜索树的第k个结点
    JPA ---- EntityManager使用
    JPA ---- EntityManager介绍
    win10多桌面切换
    $emit子组件如何传递多个参数
    height高度自适应
    vue Avoided redundant navigation to current location
    Ant Design 使用小结
    Object.keys方法之详解
  • 原文地址:https://www.cnblogs.com/cangxw/p/8252814.html
Copyright © 2011-2022 走看看