Остановить статический конструктор - PullRequest
0 голосов
/ 02 октября 2010

Как остановить запуск статического конструктора (т.е. конструктора модуля и конструктора типа) в .NET?

Например:

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

Как вызвать i() без выхода?

Ответы [ 3 ]

5 голосов
/ 02 октября 2010

Как остановить запуск статического конструктора в .NET?

Ты не можешь этого сделать. Статический конструктор будет вызван до создания любого экземпляра типа или ссылки на любой статический член. Он вызывается CLR, и вы абсолютно не можете контролировать точное время.

Таким образом, единственный способ избежать вызова статического конструктора - никогда не ссылаться и не использовать тип, содержащий этот статический конструктор. Зачем вам сначала определять статический конструктор, если вы не хотите, чтобы он выполнялся? Поместить инструкцию Environment.Exit(0) в статический конструктор - все равно что взять пистолет и выстрелить себе в ногу.

1 голос
/ 19 мая 2011

Как уже упоминали другие, если вы загрузите тип, будет запущен статический конструктор.Там нет никакого способа обойти это.

Вы можете использовать Cecil или MS CCI.Оба они позволяют вам проверять тип, не загружая его.Вы можете создать динамический тип путем клонирования класса A, удалить статический конструктор и, наконец, создать измененный тип.

1 голос
/ 02 октября 2010

На самом деле я делаю интерпретатор .net,

Если вы используете

  System.Reflection.Assembly.ReflectionOnlyLoadFrom(fileName);

Статический ctor не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...