【问题标题】:Forcing class load强制类加载
【发布时间】:2011-05-10 01:21:16
【问题描述】:

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

假设我已经上课了

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

有没有办法打印这条线?

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

【问题讨论】:

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


    【解决方案1】:

    我通常在具有静态构造函数的类上创建一个虚拟(空)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 强制静态构造函数在包含程序集已加载。

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

    【讨论】:

    • 是的,我可以自己打电话给.cctor - 我只是不确定这是否会阻止 CLR 再次调用它。
    • 另外,在静态类型上调用类型初始化程序失败! “无法创建 A 的实例,因为它是一个抽象类。”我不明白为什么该消息是相关的,但这就是我得到的。
    • 至于我想要完成的工作,我基本上是从一种对何时加载类有严格规定的语言编译的——所以我想在正确的时间加载它们。跨度>
    • 在 .net 4 中存在问题 - 看这里msmvps.com/blogs/jon_skeet/archive/2010/01/26/…
    【解决方案2】:

    在CLI规范中翻找,找到了方法RuntimeHelpers.RunClassConstructor的引用

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

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

    【讨论】:

    • 要使用它,请在您的Type 实例上传递TypeHandle 属性的结果。
    猜你喜欢
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多