为什么在加载此程序集时CLR不允许调用相同的程序集函数?

问题描述

我从《 CLR via C#》第587页看到了这,这是句子。

当程序集中加载了ReflectionOnlyLoadFrom或ReflectionOnlyLoad时,CLR禁止执行该程序集中的任何代码;在加载了这两种方法之一的程序集中执行代码的任何尝试都会导致CLR引发InvalidOperationException。

我想这是为了线程安全?谢谢,请给我一些建议。

解决方法

“仅反射加载”旨在允许您检查程序集元数据,而不必将程序集实际加载到执行过程中。

您不能从“仅反射加载”中调用该函数,因为程序集实际上并未加载到可执行进程中。

进一步阅读
How to inspect assemblies with reflection before including them in your application

,

不,这与线程安全无关。 “仅反射负载”的重点是,您可以检查程序集的内容而无需(或不希望)执行任何操作。因此,通过使用此API,您可以明确声明“我肯定不想在此处运行任何内容”。因此,可以合理地预期我们实际上不能运行事情。

除了避免激活组装所需的大量机械零件之外,这还避免了模块初始化程序的某些(尽管不太可能)攻击向量(是的,这是一件事情-甚至有计划在C#中添加支持),该程序可以任意运行当您以为自己正在做的所有事情都是查看装配体的形状时,就可以编写代码。

如果您想执行事情:请不要简单地使用仅反射加载。