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

3

所以,我正在尝试弄清楚自定义属性与二进制大对象(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")]

这一切是如何运作的?具体来说呢,在IT技术方面,需要采用哪些方法进行实现呢?
1个回答

4

这个格式是在ECMA通用语言基础设施标准中详细规定的,具体包括第II.22.10节“CustomAttribute:0x0C”(第216页)。

它以“此部分仅包含信息性文本”开头:

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

并在6号点继续说明:

  1. 关于值“blob”的整体结构,应遵循以下规则(§ II.23.3):
  • Prolog 必须为 0x0001 [错误]

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

其余的文本详细说明了剩下的内容如何布局,但所有规范都在规范中。

还有一份深入分析,展示了它在CLR中的表示方式以及对属性blob存储的影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接