gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:46:41 25 4
gpt4 key购买 nike

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

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

来自 AssemblyBuilder.SetCustomAttribute

澄清:所谓有意义,我的意思是您希望用什么样的数据来填充该数组?它有什么作用?

是否有类似二进制格式化程序序列化现有属性并将该数据传递给它的东西?

最佳答案

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

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

internal class MyAttribute : Attribute
{
public string Foo;
}

如果我们将它与类似 [MyAttribute(Foo = "4")] 的东西一起应用到 token ,它必须序列化:

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

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

.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 了解所有字段)。 Type 是 0x50,Property 是 0x54,还有一些其他的。 (这解释了第 5 个字节,0x53)。
  4. 有关数据(字符串)编码的其他详细信息。
  5. 字段名(Foo = 0x46 0x6F 0x6F)
  6. 字符串的长度(0x1)
  7. 字符串0x34 = "4"的UTF8值

关于c# - AssemblyBuilder.SetCustomAttribute 中字节数组的用途是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8142300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com