如何使用反射来查找类库引用的名称空间?

时间:2014-10-08 17:52:04

标签: c# .net reflection namespaces

例如......

using System;
using System.IO;

namespace Whatever
{
  public class SomeClass
  {
  }
}

如果将其编译到类库 mylibrary.dll 中,我希望能够使用反射加载 mylibrary.dll 并查明它是否引用{ {1}}命名空间。

我尝试使用System.IO,然后在这些程序集中识别名称空间,但是这将始终为我提供在这些程序集中定义的所有名称空间,无论它们是否实际在 mylibrary.dll中引用。由于Assembly.GetReferencedAssembliesSystem.IO和许多其他重要命名空间共享一个程序集,因此无效。

我想到的另一件事是找出是否引用了该命名空间中的一个类,但是我找不到使用反射来做到这一点的方法。

这适用于插件系统,其目的是通过在引用这些名称空间时拒绝加载库来阻止插件使用某些名称空间(如System)。

1 个答案:

答案 0 :(得分:1)

您可以在Mono.Cecil中加载程序集。它允许您读取每个函数中的实际MSIL opcodes

其中一些操作码会引用类:call / callvirt / newobj等。读取每个类的所有参数,您将能够列出引用的类型,这将引导您进入名称空间列表。

BUT ...

由于你正在尝试使用它来保证安全性,我必须说这不是一个好主意:这很容易绕过。例如,你可以使用反射。你也可以阻止反射API,但是你可以用编译的lambda表达式,P / Invoke或混合模式程序集来绕过它......你也可以阻止它们但是我认为你不能阻止它们每一种可能的解决方法。

您应该做的是将程序集加载到sandboxed AppDomain并让CLR拒绝为您提供不安全的API调用。这是一个实际上是为此目的而设计的功能。它是在CLR中实现的,依靠它而不是你自己的解决方案会更加安全。