由于各种原因,我正在学习 CIL,似乎类的定义通常类似于:
.class public auto ansi beforefieldinit [...] extends [mscorlib]System.Object
Run Code Online (Sandbox Code Playgroud)
和函数定义为:
.method [...] (args) cil managed
Run Code Online (Sandbox Code Playgroud)
我理解其他一切,但我似乎无法找出“自动”或“ansi”或“cil管理”的作用。关键字也太模糊了,我无法获得特定的搜索结果(beforefieldinit 几乎立即出现)。
ECMA-335 提供您寻求的信息,
在II.10.1 Type header(ClassHeader) 下你会发现:
auto - 自动提供字段布局。- §II.10.1.2
ansi - 将字符串作为 ANSI 编组到平台。- §II.10.1.5
Serge Lidin 在他的著作.Net IL Assembler中的第 1 章类声明中写道:
此上下文中的关键字 auto 定义了类布局样式(自动,默认),指示加载器以它认为合适的方式布局此类。替代方案是顺序的(保留字段的指定序列)和显式的(明确指定每个字段的偏移量,为加载程序提供布局类的确切指令)。关键字 ansi 定义了与非托管代码互操作时类内的字符串转换模式。此关键字是默认值,指定字符串将与“普通”C 样式字节字符串相互转换。替代关键字是 unicode(字符串与 UTF-16 Unicode 相互转换)和 autochar(底层平台决定字符串转换的模式)。
在II.23.1.11 方法标志 [MethodImplAttributes] 下,您可以阅读:
IL - 0x0000 - 方法实现是 CIL
Managed - 0x0000 - 方法 impl 被管理
Serge Lidin 在第 1 章方法声明下对此进行了描述:
关键字 cil 和 managed 定义了 MethodDef 的所谓实现标志,并指示方法主体在 IL 中表示。以本机代码而不是 IL 表示的方法将带有本机非托管的实现标志。
我建议你买一本关于这个主题的书,我认为有一些。它比在 ECMA-335 规范中挖掘要快得多。