ModuleInit.Fody NuGet 包用于 IL 代码注入以调用 ModuleInitializer.Initialize()。
当主执行程序集中没有使用类型时,其他引用的程序集不会用ModuleInitializer. 仅在使用引用程序集中的某种类型的情况下。
直接调用Assembly.Load("OtherAssemblyName")不会触发初始化。
那么如何在引用的程序集中初始化模块而不使用该程序集中的任何类型呢?
ModuleInit.Fody NuGet 包用于 IL 代码注入以调用 ModuleInitializer.Initialize()。
当主执行程序集中没有使用类型时,其他引用的程序集不会用ModuleInitializer. 仅在使用引用程序集中的某种类型的情况下。
直接调用Assembly.Load("OtherAssemblyName")不会触发初始化。
那么如何在引用的程序集中初始化模块而不使用该程序集中的任何类型呢?
在这种情况下,我所做的是声明一个“程序集初始化程序”类,该类由调用程序集识别(选择您喜欢的任何约定:预定义名称,用自定义[AssemblyInitializer]属性装饰,实现接口,无论对您有用) . 然后加载另一个程序集的程序集搜索此“程序集初始化程序”类并调用其静态构造函数(或实例化它,再次对您有用)。
再解释一下为什么我更喜欢这种方式:在这种情况下,正在加载的程序集通常需要在共享类型注册表(例如 IoC 容器)中自注册某些类型,注册一些事件处理程序,或执行任何其他引导典型的插件或其他模块化架构。拥有一致的“程序集初始化程序”方法为调用此类引导程序提供了如此集中的全局机会。
一个好主意是连接到程序集解析过程并从中央透明位置调用“程序集初始化程序”。但是,您需要省略系统程序集,并且不要忘记在安装初始化机制后处理已加载的程序集。
您有 2 个选项:
1) 使用虚拟 Console.WriteLine(typeof(SomeTypeInsideTheAssembly).FullName);
2)如果您想要一个更通用的解决方案,您可以使用帮助程序将程序集预加载到您的应用程序域中。可以在以下位置找到一个示例: