Неправильное поведение [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 );