"<Module>类的目的是什么?"

3

当反编译.NET程序集时,我注意到编译器在全局命名空间中添加了一个空的内部类,名为<Module>。该类在程序集的其他任何地方都没有被使用,并且其名称是C#不合法的标识符。

这个类是什么,它有什么作用?

1个回答

6
根据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),在使用反射时需要注意这一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接