2010-10-02 2 views
0

Как остановить статический конструктор (например, конструктор конструктора &) от работы в .NET?Остановить статический конструктор

Например:

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

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

+10

//Environment.Exit(0); :) – kofucii

+0

@kofucii: LOL для «комментария». –

ответ

1

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

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

System.Reflection.Assembly.ReflectionOnlyLoadFrom(fileName); 

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

+0

Да, я знаю, что статический конструктор не будет работать в только контекст отражения, но я тоже не смогу создавать объекты типа в сборке. – Kii

+0

@Kii и тип безопасности типа dotNET говорят, что вы не можете создавать объекты без запуска связанных статических ctors. –

+0

да, поэтому я собираюсь сломать тип безопасности :) – Kii

5

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

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

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

+0

Я хочу загрузить сборку со статическим конструктором, которая не позволяет загружать ее другими программами. Также я вижу некоторые коды в SSCLI, что он контролируется флажком ClassInit, поэтому я полагал, что должен быть какой-то странный способ его остановить. – Kii

+0

Ассембли не имеют статических конструкторов. Типы делают. –

+0

есть конструктор модулей, и я думаю, что он должен быть статическим – Kii

1

Как уже упоминалось, при загрузке типа будет запускаться статический конструктор. Об этом нет.

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

Смежные вопросы