Vb.net 使用System.Reflection确定所有引用

Vb.net 使用System.Reflection确定所有引用,vb.net,reference,system.reflection,Vb.net,Reference,System.reflection,我试图用System.Reflection确定dll中的每个引用。但是,getReferenceAssembly仅列出“引用”(在解决方案资源管理器中可见)中的引用 我想从代码本身中确定引用,例如imports语句。甚至像if/then语句、try/catch、绝对一切 使用系统反射可以做到这一点吗?如果是,怎么做 我当然更愿意在不使用p/invoke的情况下执行此操作 谢谢你的帮助 这是在vb.net中。听起来像是您需要的 (如果您正在编写分析应用程序的工具,这是一项艰巨的任务)EDIT 如后

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

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

使用
系统反射
可以做到这一点吗?如果是,怎么做

我当然更愿意在不使用p/invoke的情况下执行此操作

谢谢你的帮助

这是在vb.net中。

听起来像是您需要的

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

EDIT 如后面的注释所述,您只需要代码直接使用的程序集

getReferenceAssembly
将执行此操作


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

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


您可以对每个引用递归调用
getReferenceAssembly
,并获得整个间接依赖关系树

编辑

例如:

static IEnumerable<Assembly> (Assembly a) {
    return a.GetReferencedAssemblies()
            .Concat(a.GetReferencedAssemblies()
                     .SelectMany<Assembly, Assembly>(GetAllReferences)
            );
静态IEnumerable(程序集a){
返回a.getReferencedAssemblys()
.Concat(a.getReferencedAssemblys()
.SelectMany(获取所有引用)
);

但是,如果其中一个引用使用了原始程序集无法访问的代码路径中的程序集,则可能会出现误报。由于接口和多态性的原因,很难消除此类误报。如果任何可访问代码路径中的任何代码使用反射,则从定义上讲是不可能的。

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

GetReferencedAssemblys是准确的


编写此代码之前,请仔细阅读。

您的意思是什么?
GetReferenceAssemblys
应返回DLL使用的每个程序集。如果代码使用System.IO中的某些内容,我希望能够告诉您它使用了System.IO中的某些内容,而没有将其添加为引用。System.IO不会显示为
GetRefeRenceAssembly
,如果它不是作为引用添加的,即使代码本身使用它。您想通过引用的程序集树递归,过滤到那些可以从原始程序集访问的程序集吗?如果某个东西调用
Type.GetType()
?非常多。如果代码以任何方式、形状或形式引用它呢(请原谅我的陈词滥调),我想知道它。关于
Type.GetType()
,你是说这是一个可行的解决方案,还是一个问题?一个问题。
Type.GetType()
接受一个字符串并返回一个
Type
对象。如果程序集写入
Type.GetType(Console.ReadLine()),会发生什么情况.InvokeMember(…)
?听起来很麻烦。你可能会认为它们会包含类似于
GetAllAssemblies
方法之类的内容。根据你的递归思想,问题是这只会获取引用程序集的引用。如果有意义,我只想处理直接在dll本身中引用的程序集。这整个概念确实令人困惑…我的意思是,我不关心在引用的程序集中引用的程序集。我只希望从dll本身派生程序集。然后
getReferenceAssemblys
将完成您要查找的操作。