强制类加载

在C#或.net IL中是否有一种方法可以强制一个具有类型初始化器(静态构造函数)的类来加载自身,而无需访问它的任何参数?

假设我上了课

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

有没有办法让这条线印刷?

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

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

如果一种语言希望提供更严格的行为 – 例如,类型初始化会自动触发基类初始化程序的执行,从上到下依次 – 那么它可以通过以下任一方式执行:

  • 在每个类构造函数中定义隐藏的静态字段和代码,它们接触其基类的隐藏静态字段和/或它实现的接口,或者
  • 通过显式调用System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor (请参阅分区IV)。

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

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

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

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

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