2

我试图用System.Reflection. 但是,GetReferencedAssemblies仅列出“参考”中的那些(在解决方案资源管理器中可见)。

我想从代码本身中确定引用,例如imports语句。甚至像 if/then 语句、try/catch 之类的东西,绝对是一切

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

我肯定更愿意在没有 p/invoke 的情况下这样做。

谢谢您的帮助!

这是在 vb.net 中。

4

3 回答 3

3

听起来你需要NDepend

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

于 2010-03-04T03:35:43.897 回答
2

编辑

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

GetReferencedAssemblies 会这样做


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

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


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

编辑

例如:

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

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

于 2010-03-04T03:47:03.840 回答
1

You are confusing namespace names with assembly names. System.IO is a namespace. It actually appears in more than one assembly. The System.IO.File class lives in mscorlib.dll, System.IO.FileSystemWatcher in system.dll, System.IO.Pipes.PipeStream in system.core.dll

GetReferencedAssemblies is accurate.

Play around with Red Gate's Reflector before writing this code.

于 2010-03-04T04:54:13.553 回答