2

Assembly 类有一个返回引用程序集的 GetReferencedAssemblies 方法。有没有办法找到引用了哪些类型?

4

3 回答 3

1

CLR 无法在运行时告诉您。您必须对源文件进行一些严肃的静态分析 - 类似于 resharper 或 Visual Studio 所做的静态分析。

静态分析是一项相当重要的工作。您基本上需要 ac# 解析器、符号表和大量时间来处理抽象语法树中出现的所有情况。

为什么 CLR 不能在运行时告诉你?它是及时编译的,这意味着 CLR 字节码在执行之前被转换为机器码。反射只告诉你在运行时静态知道的关于你的类型的东西,CLR 只会知道在代码运行时是否引用了一个类型。CLR 只知道在执行时加载类型的时间 - 在即时编译时。

于 2012-06-25T10:41:26.303 回答
0

使用System.Reflection.Assembly.GetTypes()

于 2012-06-25T10:34:19.033 回答
0

类型不与程序集分开引用。如果一个程序集引用另一个程序集,它也会自动引用(至少在技术上下文中)该程序集内的所有类型。为了获取程序集中定义(未引用)的所有类型,可以使用Assembly.GetTypes方法。

可能有可能,但听起来像是一项相当艰巨的任务,扫描程序集它引用的实际类型(即它实际调用或以其他方式提及的类型)。这可能涉及使用 IL。最好避免这样的事情。

编辑: 实际上,当我想到它时,这根本不可能。任何。在相当基本的层面上。问题是,类型可以随意实例化和引用。这种情况甚至并不少见。更不用说后期绑定了。所有这一切都意味着尝试分析它引用的所有类型的程序集就像预测未来一样。

编辑 2:评论

虽然如前所述,由于各种动态引用,这个问题是不可能的,但使用差异编码可以大大缩小各种二进制文件。这基本上允许您获取包含两个二进制文件之间差异的文件,在可执行文件/库的情况下,它往往比任何一个实际文件都要小得多。以下是一些执行此操作的应用程序。请注意,bsdiff 不在 Windows 上运行,但那里有一个端口链接,您可以在 Google 的帮助下找到更多端口(包括到 .NET)。

如果你仔细看,你会发现更多这样的应用程序。最好的部分之一是,它们是完全独立的,您需要做的工作很少。

于 2012-06-25T10:35:58.853 回答