Принуждение нагрузки класса
Есть ли способ в С# или .net IL заставить класс, у которого есть инициализатор типа (статический конструктор) для загрузки себя, без доступа к каким-либо его параметрам?
Предполагая, что у меня есть класс
public static class LogInitialization {
static LogInitialization() {
System.Console.WriteLine("Initialized");
}
}
Есть ли способ распечатать эту строку?
Обратите внимание, что класс является статическим, поэтому я не могу его инициализировать, чтобы принудительно инициализировать, и у него нет открытых элементов, поэтому я не могу получить к ним доступ, чтобы запустить его.
Ответы
Ответ 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, чтобы заставить статический конструктор выполнить, когда содержащий сборку.
Я предполагаю, что реальный вопрос, как обычно, - это... что вы пытаетесь выполнить?