Принудительная загрузка класса - PullRequest
12 голосов
/ 15 ноября 2010

Есть ли способ в C # или .net IL заставить класс, который имеет инициализатор типа (статический конструктор), загрузить себя без доступа к каким-либо из его параметров?

Предполагая, что у меня есть класс

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

Есть ли способ заставить эту строку печатать?

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

Ответы [ 2 ]

13 голосов
/ 15 ноября 2010

Порывшись в спецификации CLI, я нашел ссылку на метод RuntimeHelpers.RunClassConstructor

Если язык желает обеспечить более жесткое поведение - например, инициализация типа автоматически запускает выполнение инициализаторов базового класса в порядке сверху вниз - тогда он может сделать это либо:

  • определение скрытых статических полей и кода в каждом конструкторе класса, который касается скрытого статического поля его базовый класс и / или интерфейсы, которые он реализует, или
  • путем явных вызовов System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor (см. Раздел IV).
7 голосов
/ 15 ноября 2010

Я обычно создаю фиктивный (пустой) метод 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

РЕДАКТИРОВАТЬ: Еще одна вещь, которую я делал в прошлом, - это создание атрибута с именем requireInitializationAttribute, а затем в AssemblyLoad сканировать сборку на наличие типов с таким атрибутом и использование type.TypeInitializer, чтобы принудительно выполнить статический конструктор, когда содержащий сборку загружен.

Полагаю, реальный вопрос, как обычно, заключается в том ... чего вы пытаетесь достичь?

...