当反编译.NET程序集时,我注意到编译器在全局命名空间中添加了一个空的内部类,名为<Module>
。该类在程序集的其他任何地方都没有被使用,并且其名称是C#不合法的标识符。
这个类是什么,它有什么作用?
<Module>
类包含程序集的全局字段和方法。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
),在使用反射时需要注意这一点。