【问题标题】:Determining if a class is referenced C#确定一个类是否被引用 C#
【发布时间】:2012-06-19 19:30:35
【问题描述】:

我很好奇是否可以确定程序集是否引用了特定类。我目前正在使用反射来加载程序集,然后我确定从我正在加载的程序集中引用了哪些程序集:

foreach (var vReferencedAssembly in vSomeAssembly.GetReferencedAssemblies())

现在我知道引用了哪些程序集,我想深入研究这些 vReferencedAssembly 并确定是否发生类似情况:

File.Create(vSomeFile);

简单地说,我不想从提供给我的可能包含我认为威胁的列表中加载程序集。所以我可能想阻止可能操纵文件等的东西。

【问题讨论】:

  • 这是动态的要求吗?如果它是静态的,您可以使用反汇编程序查看引用的程序集以及它可能调用的内容。
  • 我想如果可能的话,我希望它是动态的。最好的选择可能是使用反汇编程序。

标签: c# reflection .net-assembly


【解决方案1】:

我相信您正在寻找的是将程序集加载到仅反射上下文中。这允许您将它们加载到安全区域,在您检查它们之前不会执行任何代码。

见:http://msdn.microsoft.com/en-us/library/ms172331.aspx

更新:您可以使用反射来查看变量、属性、参数、返回类型等内容但这仍然无法帮助您检测完全包含在方法中的恶意代码。据我了解,区分安全代码和不安全代码最好留给系统管理员。这些应用程序与 PC 上的安全位置具有隐式信任关系。 IE:全局程序集缓存,当前工作目录或您的应用程序确定的某个固定路径。然后,PC 仅授予管理员管理此位置的程序集的能力。

更新 2:您也可以考虑在它自己的应用程序域中运行这个可能不安全的代码。在这里你可以设置什么是允许的,什么是不允许的。见http://msdn.microsoft.com/en-us/library/bb763046.aspx

更新 3:虽然我仍然认为在其自己的应用程序域中以适当的权限加载不受信任的代码是最干净的方法,但可以确定该方法在运行时内部引用的内容,正如 question 所要求的那样。它的要点是使用反射来获取方法(MethodBody.GetILAsByteArray) 的原始IL 字节,并使用您选择的IL 解析器对其进行分析。

【讨论】:

  • 我不知道这是否是我想要的。我将如何检查程序集以确定是否引用或调用了特定类?例如:我知道 mscorlib (mscorlib.dll) 包含 File.Create,但这并不意味着我刚刚加载的程序集实际上引用了 File.Create。我怎样才能确定呢?如果有的话..
  • 看起来反射可以识别方法参数或返回中使用的类,但如果在方法的实际主体中引用,我将无法找到它......
猜你喜欢
  • 1970-01-01
  • 2010-10-12
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
相关资源
最近更新 更多