如何阻止静态构造函数(即模块构造函数和类型构造函数)在.NET中运行?
例如:
class A
{
static A()
{
Environment.Exit(0);
}
static int i()
{
return 100;
}
}
如何在不退出的情况下调用i()
?
答案 0 :(得分:5)
如何阻止静态构造函数在.NET中运行?
你不能这样做。在创建任何类型的实例或引用任何静态成员之前,将调用Static constructor。它由CLR调用,你完全无法控制确切的时间。
因此,避免调用静态构造函数的唯一方法是永远不要引用和使用包含此静态构造函数的类型。如果你不希望它被执行,为什么你首先要定义一个静态构造函数?将Environment.Exit(0)
指令放入静态构造函数就像拿枪并将自己射入腿部。
答案 1 :(得分:1)
其实我正在翻译.net,
如果您使用
System.Reflection.Assembly.ReflectionOnlyLoadFrom(fileName);
静态ctor不会运行。
答案 2 :(得分:1)
正如其他人所提到的,如果加载类型,静态构造函数将会运行。没有办法绕过它。
您可以使用Cecil或MS CCI。它们都允许您在不加载的情况下检查类型。您可以通过克隆类A来创建动态类型,并删除静态构造函数,最后创建修改后的类型。