AssemblyBuilder.SetCustomAttribute中字节数组的用途是什么

时间:2011-11-15 19:52:44

标签: c#

是否有任何有意义的使用方法

public void SetCustomAttribute(
    ConstructorInfo con,
    byte[] binaryAttribute
)

来自AssemblyBuilder.SetCustomAttribute

澄清:有意义的,我的意思是你想要用什么样的数据填充该数组?它有什么作用?

是否有类似我可以二进制格式化程序序列化现有属性并将其传递给该数据?

3 个答案:

答案 0 :(得分:5)

因为属性存储是一门神奇的科学。它们总是使用编码的二进制格式存储,在这种情况下,它只是为您提供对属性的二进制内容的原始写入访问。很大程度上,这将由实现自己的编译器的人使用,或者试图尽可能地扼杀每一点性能。你不能只在那里放任何你喜欢的东西,你应该遵循CLI的规范。

例如,必须对属性中构造函数参数的值进行编码。例如,以下属性:

internal class MyAttribute : Attribute
{
    public string Foo;
}

如果我们将[MyAttribute(Foo = "4")]之类的内容应用于令牌,则必须序列化:

  • 正在初始化的成员
  • 正在初始化的成员类型(字段或属性)
  • 该属性是否被继承

所以它被编译成这样的东西:

.custom instance void Dummy.MyAttribute::.ctor() = ( 01 00 01 00 53 0E 03 46 6F 6F 01 34 )

这些值意味着:

  1. 序言(编码版)。这开始于字节值0x0001(版本从未改变,AFAIK)
  2. 构造函数参数的数量(在本例中为1)(到目前为止,这将处理前4个字节,01 00 01 00。
  3. 构造函数参数的类型。如果是一个字段,则为0x53(对于所有字段,请参见CorSerializationType)。类型是0x50,属性是0x54,还有其他几个。 (这解释了第5个字节,0x53)。
  4. 有关数据编码的其他详细信息(字符串)。
  5. 字段名称(Foo = 0x46 0x6F 0x6F)
  6. 字符串的长度(0x1)
  7. 字符串0x34的UTF8值=“4”

答案 1 :(得分:2)

答案 2 :(得分:1)

它允许预编译属性,只需 geschmack 将它们放入二进制文件中,而不是通过构建器。