2010-11-15 2 views
11

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

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

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

Есть ли способ, чтобы получить эту линию, чтобы напечатать?

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

ответ

12

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

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

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

Чтобы использовать это, передайте результат свойства 'TypeHandle' в вашем экземпляре' Type'. – Sam

7

Обычно я создаю метод инициализации (пустой) 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

EDIT: Еще одна вещь, которую я сделал в прошлом, чтобы создать атрибут RequiresInitializationAttribute затем на AssemblyLoad сканируйте сборку для типов с таким атрибутом и используя type.TypeInitializer, чтобы заставить статический конструктор выполнить, когда загружается сборка.

Я думаю, что реальный вопрос, как обычно, - это ... чего вы пытаетесь достичь?

+0

Да, я мог бы просто позвонить самому '.cctor' - я просто не был уверен, что это исключает возможность повторного вызова CLR. – configurator

+0

Кроме того, вызов инициализатора типа при статических типах не выполняется! «Невозможно создать экземпляр A, потому что это абстрактный класс». Я не понимаю, почему это сообщение связано, но это то, что я получаю. – configurator

+0

Что касается того, что я пытаюсь выполнить, я в основном компилирую с языка, который имеет строгие правила о том, когда должны загружаться классы, поэтому я хочу загрузить их в нужное время. – configurator

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