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

C# 如何使用反射查找类库引用的名称空间?,c#,.net,reflection,namespaces,C#,.net,Reflection,Namespaces,例如 using System; using System.IO; namespace Whatever { public class SomeClass { } } 如果将其编译到类库mylibrary.dll中,我希望能够使用反射来加载mylibrary.dll,并找出它是否引用了System.IO命名空间 我尝试使用Assembly.getReferenceAssemblys,然后识别这些程序集中的名称空间,但这将始终为我提供这些程序集中定义的所有名称空间,无论它们是否在m

例如

using System;
using System.IO;

namespace Whatever
{
  public class SomeClass
  {
  }
}
如果将其编译到类库mylibrary.dll中,我希望能够使用反射来加载mylibrary.dll,并找出它是否引用了
System.IO
命名空间

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

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


这是针对插件系统的,其目的是防止插件使用某些名称空间,例如
system.IO
,如果引用了这些名称空间,则拒绝加载库。

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

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

但是 既然你想用它来保证安全,我必须说这不是一个好主意:这很容易绕过。例如,您可以使用反射。您也可以阻止反射API,但随后可以使用编译的lambda表达式、P/Invoke或混合模式程序集绕过反射API。。。你也可以阻止它们,但我认为你无法阻止所有可能的解决方法


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

您是否至少从简单的google搜索开始过您的示例代码没有引用
System.IO
命名空间,因为它不使用该命名空间中的任何类。是的,我已经这样做了。这些都是由名称空间定义的返回类。我需要知道引用了哪些名称空间。完全不同的事情,我无法找到如何使用谷歌做到这一点。所以,谢谢你在没有完全阅读和理解我的问题的情况下投了反对票。]@crapycodingguy我们完全理解你的问题。您是否尝试过Jon Skeet的解决方案(DJ KRAZE的搜索的第一个结果)?使用语句指定的命名空间不是引用。仅引用程序集。此外,
使用
语句只是设计时的特性。在已编译的MSIL中没有using语句是的,我正在浏览上面链接的代码,我可以看到会有很多漏洞。AppDomain的概念是完美的,但它是在Unity中运行的,至少初步研究表明Mono并不完全支持AppDomain安全性。