ReflectionOnlyLoad是否初始化或以其他方式运行任何代码?

时间:2014-04-14 11:40:17

标签: c# reflection .net-assembly

对于我正在研究的项目,我必须分析几十个组件。

这些程序集中包含的代码实际上都没有运行是非常重要的,因此我查看了Assembly.ReflectionOnlyLoadthe documentation on MSDN提及:

  

将程序集加载到仅反射上下文中   检查但未执行。该成员超载。完整的   有关此成员的信息,包括语法,用法和示例,   单击过载列表中的名称。

现在我知道常规Assembly.Load运行初始化器或它加载的对象的构造函数,但我是假设ReflectionOnlyLoad不是这种情况,或者我应该看看通过其他方式实现我想要的目标?

1 个答案:

答案 0 :(得分:2)

ReflectionOnlyLoad确实会禁止程序集中的任何代码执行。它也有自己的问题 - 值得注意的是,它不是加载任何依赖项的功能。这可能很棘手,因为反映在从不同程序集中定义的类型派生的类将失败。

据我所知,Assembly.Load 默认情况下不会在程序集中运行任何内容编辑:除模块初始值设定项外,这可能会被滥用;如果你不关心"黑客",这不是问题,因为普通的C#代码不能编写模块初始化器,但它可以添加到IL中,它可能存在于C ++ / CLI程序集中,直到你真正实现它为止 - 例如,尝试在某处获取静态字段的值 - 但是再次,在仅反射上下文中执行此操作将导致异常。

无论如何,无论您使用ReflectionOnlyLoad还是仅使用普通的Load,请确保将程序集加载到单独的应用程序域中。这允许您定义不同的安全上下文(对不受信任的程序集没有完全信任),同样重要的是,在您完成它时卸载程序集。如果您未将其加载到单独的应用程序域中,则在重新启动整个应用程序之前,您不会删除该程序集。