对于我正在研究的项目,我必须分析几十个组件。
这些程序集中包含的代码实际上都没有运行是非常重要的,因此我查看了Assembly.ReflectionOnlyLoad
,the documentation on MSDN提及:
将程序集加载到仅反射上下文中 检查但未执行。该成员超载。完整的 有关此成员的信息,包括语法,用法和示例, 单击过载列表中的名称。
现在我知道常规Assembly.Load
运行初始化器或它加载的对象的构造函数,但我是假设ReflectionOnlyLoad
不是这种情况,或者我应该看看通过其他方式实现我想要的目标?
答案 0 :(得分:2)
ReflectionOnlyLoad
确实会禁止程序集中的任何代码执行。它也有自己的问题 - 值得注意的是,它不是加载任何依赖项的功能。这可能很棘手,因为反映在从不同程序集中定义的类型派生的类将失败。
据我所知,Assembly.Load
默认情况下不会在程序集中运行任何内容(编辑:除模块初始值设定项外,这可能会被滥用;如果你不关心"黑客",这不是问题,因为普通的C#代码不能编写模块初始化器,但它可以添加到IL中,它可能存在于C ++ / CLI程序集中,直到你真正实现它为止 - 例如,尝试在某处获取静态字段的值 - 但是再次,在仅反射上下文中执行此操作将导致异常。
无论如何,无论您使用ReflectionOnlyLoad
还是仅使用普通的Load
,请确保将程序集加载到单独的应用程序域中。这允许您定义不同的安全上下文(对不受信任的程序集没有完全信任),同样重要的是,在您完成它时卸载程序集。如果您未将其加载到单独的应用程序域中,则在重新启动整个应用程序之前,您不会删除该程序集。