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安全性。