Неправильное поведение [ModuleInitializer]?

Я пытаюсь использовать [ModuleInitializer] в коде .net5. Моя тестовая сборка

      namespace TestAssembly
{
    public class Class1
    {
        [ModuleInitializer]
        public static void Init()
        {
            Console.WriteLine("ModuleInitializer");
        }
    }
}

Мне нужно, чтобы при загрузке сборки вызывался метод Init(). Код загрузки

      byte[] rawAssembly = LoadFile("TestAssembly.dll");
Assembly.Load(rawAssembly);

Но инициализатор не вызывается при загрузке. Также я пробовал

      Assembly.LoadFrom("TestAssembly.dll");
Assembly.LoadFile("TestAssembly.dll");
AppDomain domain = AppDomain.CurrentDomain;
Assembly assembly = domain.Load(rawAssembly);

Инициализатор вызывается после

      var t = Type.GetType("TestAssembly.Class1, TestAssembly", AssemblyResolver, TypeResolver, false, true);
var obj = Activator.CreateInstance(t);
        

т.е. при первом использовании любого типа из сборки. Это нормальное поведение? Могу ли я вызвать инициализатор без дополнительного кода при загрузке сборки?

2 ответа

Решение

Вот объяснение на github

Инициализатор модуля выполняется при первом доступе к любому статическому полю или при первом вызове любого метода, определенного в модуле, или когда-то раньше.

Вы должны иметь возможность достичь того, чего хотите, позвонив RunModuleConstructor нравится:

      RuntimeHelpers.RunModuleConstructor( assembly.ManifestModule.ModuleHandle );
Другие вопросы по тегам