使用 System.Reflection 确定所有引用
我试图用 System.Reflection 确定 dll 内的每个引用。但是,GetReferencedAssemblies
仅列出“参考”中的内容(在解决方案资源管理器中可见)。
我想确定代码本身内部的引用,例如 imports
语句。即使是 if/then 语句、try/catch 等,绝对一切。
使用 System.Reflection 可以做到这一点吗?如果是这样,怎么办?
我肯定更愿意在没有 p/invoke 的情况下执行此操作。
感谢您的帮助!
这是vb.net中的。
I am trying to determine every single reference inside a dll with System.Reflection
. However, GetReferencedAssemblies
only lists the ones in the "References" (visible in solution explorer).
I would like to determine references from within the code itself, such as an imports
statement. Even things like if/then statements, try/catch, absolutely everything.
Is this possible to do using System.Reflection
? If so, how?
I would definitely prefer to do this without p/invoke.
Thanks for the help!
This is in vb.net.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
听起来您需要 NDepend。
(如果您正在编写一个工具来分析应用程序,那是一项艰巨的任务)
Sounds like you need NDepend.
(If you are writing a tool to analyze an app that's a big task)
编辑
正如您后面的评论所述,您只需要代码直接使用的程序集。
GetReferencedAssemblies
将做到这一点。正如您的评论所述,您正在尝试解决停止问题。如果不实际执行原始程序集(并使用分析 API 查看它使用的类型),您就无法可靠地做到这一点。
您可以对每个引用递归调用
GetReferencedAssemblies
并获取整个间接依赖关系树。编辑:
例如:
但是,如果其中一个引用在原始程序集无法访问的代码路径中使用程序集,则可能会出现误报。由于接口和多态性,清除此类误报可能非常困难。如果任何可访问代码路径中的任何代码使用反射,则根据定义这是不可能的。EDIT
As described by your later comment, you only want the assemblies that your code uses directly.
GetReferencedAssemblies
will do that.As described by your comments, you're trying to solve the halting problem.You cannot reliably do this without actually executing the original assembly (and using the profiling API to see what type it uses).
You could recursively call
GetReferencedAssemblies
on each reference and get the entire tree of indirect dependencies.EDIT:
For example:
However, you can get false positives if one of the references uses an assembly in a code path that isn't reachable by the original assembly. Due to interfaces and polymorphism, it can be very difficult to weed out such false positives. If any of code in any reachable code path uses reflection, it is impossible by definition.您将命名空间名称与程序集名称混淆了。 System.IO 是一个命名空间。它实际上出现在不止一个程序集中。 System.IO.File类位于mscorlib.dll中,System.IO.FileSystemWatcher位于system.dll中,System.IO.Pipes.PipeStream位于system.core.dll中
GetReferencedAssemblies是准确的。
在编写此代码之前,请尝试一下 Red Gate 的 Reflector。
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.