【发布时间】:2012-06-25 10:30:44
【问题描述】:
Assembly 类有一个 GetReferencedAssemblies 方法,该方法返回 引用的程序集。有没有办法找到引用的类型?
【问题讨论】:
标签: c# .net-assembly system.reflection
Assembly 类有一个 GetReferencedAssemblies 方法,该方法返回 引用的程序集。有没有办法找到引用的类型?
【问题讨论】:
标签: c# .net-assembly system.reflection
CLR 无法在运行时告诉您。您必须对源文件进行一些严肃的静态分析 - 类似于 resharper 或 Visual Studio 所做的静态分析。
静态分析是一项相当重要的工作。您基本上需要一个 c# 解析器、一个符号表和大量时间来处理抽象语法树中出现的所有情况。
为什么 CLR 不能在运行时告诉您?它是及时编译的,这意味着 CLR 字节码在执行之前被转换为机器码。反射只告诉你在运行时静态知道的关于你的类型的东西,CLR 只会知道在代码运行时是否引用了一个类型。 CLR 只知道在执行时加载类型的时间 - 在即时编译时。
【讨论】:
类型不与程序集分开引用。如果一个程序集引用另一个程序集,它也会自动引用(至少在技术上下文中)该程序集内的所有类型。为了获得一个程序集中所有定义(未引用)的类型,可以使用Assembly.GetTypes方法。
扫描程序集以查找它引用的实际类型(即它实际调用或以其他方式提及的类型)可能是可能的,但听起来是一项相当艰巨的任务。这可能涉及使用 IL。最好避免这样的事情。
编辑: 实际上,当我想到它时,这根本不可能。任何。在相当基本的层面上。问题是,类型可以随意实例化和引用。这种情况甚至并不少见。更不用说后期绑定了。所有这一切意味着尝试分析一个程序集以了解它所引用的所有类型就像预测未来一样。
编辑 2:评论
虽然问题,如上所述,由于各种动态引用是不可能的,但 可能使用 difference encoding 大大缩小各种二进制文件.这基本上允许您获得一个包含两个二进制文件之间差异的文件,在可执行文件/库的情况下,它往往比任何一个实际文件都要小得多。以下是一些执行此操作的应用程序。请注意,bsdiff 不能在 Windows 上运行,但那里有一个端口链接,您可以借助 Google 找到更多端口(包括到 .NET)。
如果您仔细观察,您会发现更多这样的应用程序。最好的部分之一是,它们是完全独立的,您需要做的工作很少。
【讨论】: