确定是否引用了类C#

时间:2012-06-19 19:30:36

标签: c# reflection .net-assembly

我很好奇是否可以确定大会是否引用了某个特定的类。我目前正在使用Reflection来加载Assemblies,然后我确定正在加载的程序集中引用了哪些程序集:

foreach (var vReferencedAssembly in vSomeAssembly.GetReferencedAssemblies())

现在我知道引用了哪些程序集,我想深入研究那些vReferencedAssembly并确定是否会发生这样的事情:

File.Create(vSomeFile);

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

1 个答案:

答案 0 :(得分:2)

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

请参阅: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解析器进行分析。