1

我尝试在 .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);
        

即第一次使用程序集中的任何类型。这是正常行为吗?我可以在没有任何附加代码的程序集加载的情况下实现对初始化程序的调用吗?

4

2 回答 2

1

这是github上的解释

模块初始化程序在第一次访问任何静态字段或第一次调用模块中定义的任何方法时或之前的某个时间执行。

于 2021-03-31T18:12:15.040 回答
0

你应该能够通过这样的调用来实现你想要的RunModuleConstructor

RuntimeHelpers.RunModuleConstructor( assembly.ManifestModule.ModuleHandle );
于 2021-07-29T12:35:19.610 回答