【问题标题】:How to use reflection to find which namespaces are referenced by a class library?如何使用反射来查找类库引用了哪些命名空间?
【发布时间】:2014-12-03 11:45:26
【问题描述】:

例如...

using System;
using System.IO;

namespace Whatever
{
  public class SomeClass
  {
  }
}

如果这被编译到类库 mylibrary.dll 中,我希望能够使用反射来加载 mylibrary.dll 并找出它是否引用了 @ 987654324@命名空间。

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

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

这是针对插件系统的,其想法是通过在引用了这些命名空间时拒绝加载库来防止插件使用某些命名空间,例如System.IO

【问题讨论】:

  • 您是否至少从简单的谷歌搜索开始C# reflection find namespace
  • 您的示例代码没有引用 System.IO 命名空间,因为它不使用该命名空间中的任何类。
  • 是的,我已经做到了。这些都返回由名称空间定义的类。我需要知道引用了哪些命名空间。完全不同的事情,我无法找到如何使用谷歌来做到这一点。因此,感谢您在没有完全阅读和理解我的问题的情况下投下反对票。]
  • @CrappyCodingGuy 我们非常了解您的问题。您是否尝试过 Jon Skeet 的解决方案 here(DJ KRAZE 搜索的第一个结果)?
  • using 语句中指定的命名空间不是引用。仅引用 程序集。此外,using 语句只是设计时功能。对于 using 语句,编译的 MSIL 中没有任何内容

标签: c# .net reflection namespaces


【解决方案1】:

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

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

但是...

由于您尝试将其用于安全性,我必须说这不是一个好主意:这很容易绕过。例如,您可以使用反射。您也可以阻止反射 API,但是您可以使用已编译的 lambda 表达式、P/Invoke 或混合模式程序集绕过它……您也可以阻止它们,但我认为您无法阻止所有可能的解决方法。

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

【讨论】:

  • 是的,我正在研究我上面链接的代码,我可以看到会有很多漏洞。 AppDomain 的概念是完美的,但这是在 Unity 中运行的,至少初步研究表明 Mono 并不完全支持 AppDomain 安全性。
猜你喜欢
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
相关资源
最近更新 更多