【问题标题】:Stop static constructor停止静态构造函数
【发布时间】:2010-10-02 12:38:40
【问题描述】:

如何阻止静态构造函数(即模块构造函数和类型构造函数)在 .NET 中运行?

例如:

class A  
{  
    static A()  
    {  
        Environment.Exit(0);  
    }  
    static int i()  
    {  
        return 100;
    }  
}  

如何在不退出的情况下调用i()

【问题讨论】:

  • //Environment.Exit(0); :)
  • @kofucii:“评论”哈哈。

标签: .net static constructor


【解决方案1】:

如何阻止静态构造函数在 .NET 中运行?

你不能这样做。 Static constructor 将在创建该类型的任何实例或引用任何静态成员之前调用。它由 CLR 调用,您完全无法控制确切的时间。

因此,避免调用静态构造函数的唯一方法是永远不要引用和使用包含此静态构造函数的类型。如果您不希望执行静态构造函数,为什么要首先定义它?将Environment.Exit(0) 指令放入静态构造函数中就像拿枪打自己的腿一样。

【讨论】:

  • 我想加载一个具有静态构造函数的程序集,以防止它被其他程序加载。我还看到 SSCLI 中的一些代码由 ClassInit 标志控制,所以我认为应该有一些奇怪的方法来阻止它。
  • 程序集没有静态构造函数。类型可以。
  • 有模块构造函数,我认为应该是静态的
  • 实际上我正在制作.net 的解释器,所以我必须控制程序集中的所有内容以防止 clr 执行它。如果我不能阻止静态构造函数运行,那么它将运行两次。
  • @Kii:我认为你有一个架构师设计问题。不是 C# 的。
【解决方案2】:

其实我正在做一个.net的解释器,

如果你使用

  System.Reflection.Assembly.ReflectionOnlyLoadFrom(fileName);

静态 ctor 不会运行。

【讨论】:

  • 是的,我知道静态构造函数不会只在反射上下文中运行,但我也无法在程序集中创建类型的对象。
  • @Kii,并且 dotNET 的类型安全表明您无法创建不运行相关静态 ctor 的对象。
  • 这意味着你必须建立自己的 CLR...祝你好运。
【解决方案3】:

正如其他人所提到的,如果您加载类型,静态构造函数将运行。没有办法解决它。

您可以使用 Cecil 或 MS CCI。它们都允许您在不加载类型的情况下检查类型。可以通过克隆类A创建动态类型,去掉静态构造函数,最后创建修改后的类型。

【讨论】:

    猜你喜欢
    • 2011-03-01
    • 2011-04-19
    • 2010-09-12
    • 2013-08-01
    • 2011-10-07
    • 2018-01-12
    • 2013-03-05
    • 1970-01-01
    • 2011-08-13
    相关资源
    最近更新 更多