C# 当主执行程序集中没有使用类型时,如何强制初始化模块?
Fody NuGet包用于IL代码注入,以调用ModuleInitializer.Initialize() 当主执行程序集中没有使用类型时,其他引用的程序集不会使用C# 当主执行程序集中没有使用类型时,如何强制初始化模块?,c#,.net,.net-assembly,reflection.emit,fody,C#,.net,.net Assembly,Reflection.emit,Fody,Fody NuGet包用于IL代码注入,以调用ModuleInitializer.Initialize() 当主执行程序集中没有使用类型时,其他引用的程序集不会使用ModuleInitializer初始化。仅在引用程序集中的某些类型的情况下使用 直接调用Assembly.Load(“OtherAssemblyName”)不会触发初始化 那么,如何在引用的程序集中初始化模块而不使用该程序集中的任何类型?在这种情况下,我要做的是声明一个“程序集初始值设定项”类,该类由调用程序集识别(选择您喜欢的任何
ModuleInitializer
初始化。仅在引用程序集中的某些类型的情况下使用
直接调用Assembly.Load(“OtherAssemblyName”)
不会触发初始化
那么,如何在引用的程序集中初始化模块而不使用该程序集中的任何类型?在这种情况下,我要做的是声明一个“程序集初始值设定项”类,该类由调用程序集识别(选择您喜欢的任何约定:预定义的名称,用自定义的
[AssemblyInitializer]修饰)
attribute,实现一个接口,任何适合您的东西)。然后,加载另一个类的程序集搜索这个“程序集初始值设定项”类并调用它的静态构造函数(或者实例化它,不管它对您有用)
再解释一下为什么我更喜欢这种方式:在这种情况下,正在加载的程序集通常需要在共享类型注册表(如IoC容器)中自注册某些类型,注册一些事件处理程序,或者执行插件或其他模块化体系结构的任何其他典型引导。使用一致的“程序集初始值设定项”方法可以提供这样一个集中的全局机会来调用这样的引导程序
一个好主意是从一个中心的、透明的位置创建和调用“程序集初始值设定项”。但是,您需要省略系统程序集,并且在安装初始化机制后不要忘记处理已加载的程序集。您有两个选项:
1) 使用虚拟控制台.WriteLine(typeof(SomeTypeInsideTheAssembly.FullName)
2) 如果需要更通用的解决方案,可以使用帮助器将程序集预加载到appdomain中。可在以下网址找到示例: