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

C# AssemblyBuilder.SetCustomAttribute中字节数组的用途是什么,c#,C#,有什么有意义的方法可以使用吗 public void SetCustomAttribute( ConstructorInfo con, byte[] binaryAttribute ) 从 澄清:我所说的有意义,是指您希望用什么样的数据填充该数组?它和它有什么关系 有什么东西可以让二进制格式化程序序列化现有属性并将数据传递给它吗?因为属性存储是一门神奇的科学。它们总是使用编码的二进制格式进行存储,在这种情况下,它只是为您提供对属性的二进制内容的原始写访问权。在很大程度上,这将被

有什么有意义的方法可以使用吗

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

澄清:我所说的有意义,是指您希望用什么样的数据填充该数组?它和它有什么关系


有什么东西可以让二进制格式化程序序列化现有属性并将数据传递给它吗?

因为属性存储是一门神奇的科学。它们总是使用编码的二进制格式进行存储,在这种情况下,它只是为您提供对属性的二进制内容的原始写访问权。在很大程度上,这将被实现自己的编译器的人使用,或者试图尽可能地提高每一点性能。您不能将任何您想要的东西放在其中,您需要遵循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 )
这些值意味着:

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

  • 它将允许预编译属性,只需将属性压缩到二进制文件中,而无需经过构建器。

    编码记录在“MS分区II”第23.3节中,可下载@


    re:

    有没有办法从
    AncustomAttributeProvider.GetCustomAttributes获取此二进制数据(..
    调用以便我可以使用它克隆属性并将其放置在另一个成员中?@chrismaric我看不到获得直接二进制表示的方法。
    GetCustomAttributesData
    是最接近的方法。或者说可以做到这一点。通常,.NET Framework本身很擅长生成低级别的片段,但不适合因此,塞西尔和CCI的存在。