自定义属性blob(字符串)使用什么样的格式?

时间:2012-11-28 15:33:40

标签: .net attributes blob il

所以,我试图弄清楚blob的自定义属性是如何工作的。二进制格式似乎非常奇怪。

来自ildasm

的示例
.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = 
       ( 01 00 19 57 69 6E 64 6F 77 73 50 68 6F 6E 65 2C   // ...WindowsPhone,
        56 65 72 73 69 6F 6E 3D 76 38 2E 30 01 00 54 0E   // Version=v8.0..T.
        14 46 72 61 6D 65 77 6F 72 6B 44 69 73 70 6C 61   // .FrameworkDispla
        79 4E 61 6D 65 11 57 69 6E 64 6F 77 73 20 50 68   // yName.Windows Ph
        6F 6E 65 20 38 2E 30 )                            // one 8.0

这是什么类型的格式?我不能确定这是真的UTF-8,为什么前两个字节是0x01和0x00?此外,反编译器将选择这个作为属性:

[assembly: TargetFramework("WindowsPhone,Version=v8.0", FrameworkDisplayName = "Windows Phone 8.0")]

这一切究竟是如何运作的?

1 个答案:

答案 0 :(得分:3)

其格式列于ECMA Common Language Infrastructure standard,特别是标题为“CustomAttribute:0x0C”的第II.22.10节(第216页)。

它启动“这包含仅提供信息的文本”部分:

  

所有二进制值都以little-endian格式存储......

并在第6点继续:

  

6)以下规则适用于Value'blob'(§II.23.3)的整体结构:

     
      
  • Prolog应为0x0001 [ERROR]
  •   

这就是为什么你会看到[ 0x01, 0x00 ]的第一个字节。

本文的其余部分继续说明其余部分的布局,但这些都在规范中。

还有一个in-depth analysis,它显示了它在CLR中的表示方式以及它如何影响属性blob的存储。