<Module>类的目的是什么?
c#
在反编译 .NET 程序集时,我注意到编译器添加了一个以<Module>全局命名空间命名的空内部类。此类不在程序集中的任何其他地方使用,其名称是非法的 C# 标识符。
这个类是什么,它的目的是什么?
回答
根据CLI 的 Ecma 规范的§II.10.8 ,<Module>该类包含程序集的全局字段和方法。
C# 没有这样的概念,但是 .NET 运行时使用这个类来支持模块初始值设定项。
从 C# 9.0 开始,可以从代码定义模块初始值设定项。这个片段:
using System.Runtime.CompilerServices;
public static class C {
[ModuleInitializer]
public static void M() {
}
}
将编译成这样的:
internal class <Module>
{
static <Module>()
{
C.M();
}
}
public static class C
{
// On frameworks earlier than .NET 5 you have to define the attribute yourself.
[ModuleInitializer]
public static void M()
{
}
}
<Module>的静态构造函数将在程序集加载时执行一次,并将调用所有以ModuleInitializerAttribute.
作为旁注,<Module>该类没有祖先(其BaseType属性设置为null);使用反射时要记住的事情。