Подтвердить что ты не робот

Принуждение нагрузки класса

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Обычно я создаю метод ложного (пустого) 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, чтобы заставить статический конструктор выполнить, когда содержащий сборку.

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