[ModuleInitializer] 的行为不正确?
Incorrect behavior of the [ModuleInitializer]?
我尝试在 .net5 代码中使用 [ModuleInitializer]。我的测试程序集
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);
即首次使用程序集中的任何类型时。
这是正常行为吗?我可以在程序集加载时不使用任何附加代码实现对初始化程序的调用吗?
这里有关于github
的解释
A module initializer is executed at, or sometime before, first access
to any static field or first invocation of any method defined in the
module.
你应该可以通过像这样调用 RunModuleConstructor
来实现你想要的:
RuntimeHelpers.RunModuleConstructor( assembly.ManifestModule.ModuleHandle );
我尝试在 .net5 代码中使用 [ModuleInitializer]。我的测试程序集
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);
即首次使用程序集中的任何类型时。 这是正常行为吗?我可以在程序集加载时不使用任何附加代码实现对初始化程序的调用吗?
这里有关于github
的解释A module initializer is executed at, or sometime before, first access to any static field or first invocation of any method defined in the module.
你应该可以通过像这样调用 RunModuleConstructor
来实现你想要的:
RuntimeHelpers.RunModuleConstructor( assembly.ManifestModule.ModuleHandle );