MSIL中每个类的最大字段数

时间:2014-03-14 20:21:10

标签: .net il

我正在设计一个后处理.NET程序集的系统,并为它在程序集中找到的每个ldstr IL指令添加一个新的字符串字段。我将创建一个新类并向其添加字段,然后用ldstr(或其他东西)替换ldfld指令以在运行时访问该字段。

类可以包含的字段数是否有限制?我现在想的可能是成千上万的田地。

我正在使用Mono.Cecil进行IL工作。

1 个答案:

答案 0 :(得分:3)

  • Field元数据表中的Ids是3个字节(四个中的第一个字节用于标识表)。这意味着模块中最大可能的字段数(组件中通常只有一个模块)为16M。
  • CLR似乎仅限于64k - 1个字段。您将无法创建具有比使用Reflection.Emit更多的字段的类型,或使用Reflection加载此类型。但是你可以通过创建多个类型来解决这个问题,每个类型都低于这个限制。
  • Mono Cecil没有此限制,因此您可以创建具有更多字段的类型,但您将无法使用它(至少不能在MS的MS实现上使用) ,Mono可能表现不同)。

这是基于查看ECMA CIL规范和我自己的测试。