强制类加载

con*_*tor 12 .net c# static-constructor classloader typeinitializer

在C#或.net IL中是否有办法强制一个具有类型初始值设定项(静态构造函数)的类来加载自身,而不访问它的任何参数?

假设我上了课

public static class LogInitialization {
    static LogInitialization() {
        System.Console.WriteLine("Initialized");
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让这条线打印出来?

请注意,该类是静态的,因此我无法将其实例化以强制初始化,并且它没有公共成员,因此我无法访问它们以启动它.

con*_*tor 13

在CLI规范中发现了一个Rummaging,我找到了对该方法的引用 RuntimeHelpers.RunClassConstructor

如果一种语言希望提供更严格的行为 - 例如,类型初始化会自动触发基类的初始值设定项的执行,按照从上到下的顺序 - 那么它可以通过以下任一方式执行:

  • 在每个类构造函数中定义隐藏的静态字段和代码,触及其基类的隐藏静态字段和/或它实现的接口,或者
  • 通过明确调用System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor (参见Partition IV).

  • 要使用它,请在"Type"实例上传入`TypeHandle`属性的结果. (2认同)

Jef*_*eff 7

我通常在具有静态构造函数的类上创建一个虚拟(空)Init方法,以强制执行静态构造函数.即.

public static void Initialize() 
{ 
  // this will force your static constructor to execute, obviously
}
Run Code Online (Sandbox Code Playgroud)

也就是说,你总是可以使用反射来获取Type.TypeInitializer ... http://msdn.microsoft.com/en-us/library/system.type.typeinitializer.aspx

编辑:我过去做过的另一件事是创建一个名为RequiresInitializationAttribute的属性然后在AssemblyLoad上扫描程序集以查找具有这种属性的类型,并使用type.TypeInitializer强制静态构造函数在包含程序集时执行加载.

我想像往常一样,真正的问题是......你想要完成什么?