使用System.Reflection确定所有引用

时间:2010-03-04 03:32:19

标签: vb.net reference system.reflection

我正在尝试使用System.Reflection确定dll中的每个引用。但是,GetReferencedAssemblies仅列出“引用”中的内容(在解决方案资源管理器中可见)。

我想确定代码本身的引用,例如imports语句。甚至像if / then语句,try / catch,绝对一切

这可以使用System.Reflection吗?如果是这样,怎么样?

我绝对不想在没有p / invoke的情况下这样做。

感谢您的帮助!

这是在vb.net。

3 个答案:

答案 0 :(得分:3)

听起来你需要NDepend

(如果您正在编写分析应用程序的工具,这是一项重大任务)

答案 1 :(得分:2)

修改

如稍后的评论所述,您只需要代码直接使用的程序集。

GetReferencedAssemblies 这样做。


正如您的评论所述,您正在尝试解决暂停问题。

如果没有实际执行原始程序集(并使用分析API查看它使用的类型),则无法可靠地执行此操作。


您可以在每个引用上递归调用GetReferencedAssemblies并获取整个间接依赖关系树。

修改

例如:

static IEnumerable<Assembly> (Assembly a) {
    return a.GetReferencedAssemblies()
            .Concat(a.GetReferencedAssemblies()
                     .SelectMany<Assembly, Assembly>(GetAllReferences)
            );

但是,如果其中一个引用使用原始程序集无法访问的代码路径中的程序集,则可能会出现误报。由于界面和多态性,可能很难清除这种误报。如果任何可到达代码路径中的任何代码使用反射,则根据定义是不可能的。

答案 2 :(得分:1)

您将命名空间名称与程序集名称混淆。 System.IO是一个名称空间。它实际上出现在多个组件中。 System.IO.File类位于system.dll中的mscorlib.dll,System.IO.FileSystemWatcher,system.core.dll中的System.IO.Pipes.PipeStream

GetReferencedAssemblies准确无误。

在编写此代码之前,请使用Red Gate's Reflector