强制类加载

时间:2010-11-15 05:12:28

标签: c# .net classloader static-constructor typeinitializer

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

假设我有班级

public static class LogInitialization {
    static LogInitialization() {
        System.Console.WriteLine("Initialized");
    }
}

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

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

2 个答案:

答案 0 :(得分:13)

在CLI规范中,我找到了对方法RuntimeHelpers.RunClassConstructor

的引用
  

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

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

答案 1 :(得分:7)

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

public static void Initialize() 
{ 
  // this will force your static constructor to execute, obviously
}

那就是说,你总是可以选择带有反射的Type.TypeInitializer ... http://msdn.microsoft.com/en-us/library/system.type.typeinitializer.aspx

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

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