Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当主执行程序集中没有使用类型时,如何强制初始化模块?_C#_.net_.net Assembly_Reflection.emit_Fody - Fatal编程技术网

C# 当主执行程序集中没有使用类型时,如何强制初始化模块?

C# 当主执行程序集中没有使用类型时,如何强制初始化模块?,c#,.net,.net-assembly,reflection.emit,fody,C#,.net,.net Assembly,Reflection.emit,Fody,Fody NuGet包用于IL代码注入,以调用ModuleInitializer.Initialize() 当主执行程序集中没有使用类型时,其他引用的程序集不会使用ModuleInitializer初始化。仅在引用程序集中的某些类型的情况下使用 直接调用Assembly.Load(“OtherAssemblyName”)不会触发初始化 那么,如何在引用的程序集中初始化模块而不使用该程序集中的任何类型?在这种情况下,我要做的是声明一个“程序集初始值设定项”类,该类由调用程序集识别(选择您喜欢的任何

Fody NuGet包用于IL代码注入,以调用ModuleInitializer.Initialize()

当主执行程序集中没有使用类型时,其他引用的程序集不会使用
ModuleInitializer
初始化。仅在引用程序集中的某些类型的情况下使用

直接调用
Assembly.Load(“OtherAssemblyName”)
不会触发初始化


那么,如何在引用的程序集中初始化模块而不使用该程序集中的任何类型?

在这种情况下,我要做的是声明一个“程序集初始值设定项”类,该类由调用程序集识别(选择您喜欢的任何约定:预定义的名称,用自定义的
[AssemblyInitializer]修饰)
attribute,实现一个接口,任何适合您的东西)。然后,加载另一个类的程序集搜索这个“程序集初始值设定项”类并调用它的静态构造函数(或者实例化它,不管它对您有用)

再解释一下为什么我更喜欢这种方式:在这种情况下,正在加载的程序集通常需要在共享类型注册表(如IoC容器)中自注册某些类型,注册一些事件处理程序,或者执行插件或其他模块化体系结构的任何其他典型引导。使用一致的“程序集初始值设定项”方法可以提供这样一个集中的全局机会来调用这样的引导程序

一个好主意是从一个中心的、透明的位置创建和调用“程序集初始值设定项”。但是,您需要省略系统程序集,并且在安装初始化机制后不要忘记处理已加载的程序集。

您有两个选项:

1) 使用虚拟控制台.WriteLine(typeof(SomeTypeInsideTheAssembly.FullName)

2) 如果需要更通用的解决方案,可以使用帮助器将程序集预加载到appdomain中。可在以下网址找到示例: