对于我正在进行的项目,我必须分析几十个程序集。
非常重要的是,这些程序集中包含的任何代码都没有实际运行,因此我查看了Assembly.ReflectionOnlyLoad
,正如MSDN上的文档所提到的:
将程序集加载到仅反射上下文中,该程序集可以位于已检查但未执行。此成员已过载。对于完整有关此成员的信息,包括语法、用法和示例,单击重载列表中的名称。
现在我知道常规的Assembly.Load
运行它加载的对象的初始化器或构造函数,但我认为ReflectionOnlyLoad
不是这样的假设是对的吗?还是我应该寻找其他方法来实现我想要的?
ReflectionOnlyLoad
确实会禁止执行程序集中的任何代码。它也有自己的问题——值得注意的是,它没有加载任何依赖项。这可能很棘手,因为反思从不同程序集中定义的类型派生的类会失败。
据我所知,默认情况下,Assembly.Load
不会在程序集中运行任何东西(EDIT:除了模块初始值设定项,它可能会被滥用;如果你不担心"黑客",这不是问题,因为普通的C#代码不能写模块初始值设置项,但它可以添加到IL中,并且可能存在于C++/CLI程序集中),直到你真正做到这一点——例如,试图在某个地方获取静态字段的值——但话说回来,在仅反射的上下文中这样做会导致异常。
在任何情况下,无论使用ReflectionOnlyLoad
还是仅使用普通的旧Load
,都要确保将程序集加载到一个单独的应用程序域中。这使您可以定义不同的安全上下文(对不受信任的程序集没有完全信任),同样重要的是,在完成程序集后卸载程序集。如果不在单独的应用程序域中加载程序集,则在重新启动整个应用程序之前,您不会删除程序集。