Обычно я не отвечал на свой вопрос, но в то же время я нашел ответ, которого здесь раньше не было, так что вот и я.
После некоторого исследования я попал на этот пост Microsoft , в котором объясняются проблемы смешивания управляемого и неуправляемого кода внутри DllMain
и решения, которое появилось со 2-й версией CLI, модуль инициализаторов . Цитата:
Этот инициализатор запускается сразу после
родной DllMain (другими словами,
за пределами блокировки загрузчика) но перед любым
управляемый код выполняется или управляемые данные
доступ из этого модуля.
семантика модуля .cctor
очень похожи на классы .cctors
и определены в ECMA C # и
Общая языковая инфраструктура
Стандарты.
Хотя я не смог найти термин инициализатор модуля внутри текущей спецификации ECMA, он логически следует из инициализатора типа и глобального специального класса <Module>
(see section 22.26 на MethodDef, подпункт 40). Эта функция была реализована после .NET 1.1 (то есть, начиная с 2.0). Смотрите также это полуофициальное описание .
Этот вопрос был не о C #, а потому, что он является языком общения в .NET: C # не знает глобальных методов, и вы не можете создать <Module>
, не говоря уже о его cctor. Тем не менее, Эйнар Эгильссон распознал этот очевидный недостаток и создал InjectModuleInitializer.exe, который позволяет сделать это как шаг после компиляции в Visual Studio. В C ++. NET использование этого метода тривиально и рекомендуется вместо DllMain
. См. Также этот SO ответ Бена Фойгта (не принятый ответ) и этот SO ответ yoyoyoyosef .
Короче говоря, инициализатор модуля - это первый метод, который вызывается после загрузки модуля (не обязательно при загрузке сборки!) И перед вызовом любого метода класса или экземпляра. Он не принимает параметров, не возвращает значений, но может содержать любой управляемый код в своем теле.