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

Chr*_*sic 2 c#

有没有什么有意义的使用方法

public void SetCustomAttribute(
    ConstructorInfo con,
    byte[] binaryAttribute
)
Run Code Online (Sandbox Code Playgroud)

来自AssemblyBuilder.SetCustomAttribute

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

有没有像我可以二进制格式化程序序列化现有属性并传递它的数据?

vcs*_*nes 5

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

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

internal class MyAttribute : Attribute
{
    public string Foo;
}
Run Code Online (Sandbox Code Playgroud)

如果我们将它应用于[MyAttribute(Foo = "4")]令牌,它必须序列化:

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

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

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

这些值意味着:

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