我正在尝试使用System.Reflection
确定dll中的每个引用。但是,GetReferencedAssemblies
仅列出“引用”中的内容(在解决方案资源管理器中可见)。
我想确定代码本身的引用,例如imports
语句。甚至像if / then语句,try / catch,绝对一切。
这可以使用System.Reflection
吗?如果是这样,怎么样?
我绝对不想在没有p / invoke的情况下这样做。
感谢您的帮助!
这是在vb.net。
答案 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。