有没有办法找到c#程序集引用的类型?

时间:2012-06-25 10:30:44

标签: c# .net-assembly system.reflection

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

3 个答案:

答案 0 :(得分:1)

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

静态分析是一项相当重要的工作。你基本上需要一个c#解析器,一个符号表,并有足够的时间来处理抽象语法树中出现的所有情况。

CLR为什么不能在运行时告诉你?它只是及时编译,这意味着CLR bytcode在执行之前就被转换为机器代码。 Reflection只会告诉你在运行时静态知道你的类型的东西,CLR只会知道代码运行时是否引用了一个类型。 CLR只知道何时在执行时加载类型 - 恰好在编译时。

答案 1 :(得分:0)

答案 2 :(得分:0)

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

扫描一个它所引用的实际类型的程序集(即它实际调用或以其他方式提到的类型),这可能是一种相当艰巨的任务。这可能涉及与IL合作。这样的事情最好避免。

编辑: 实际上,当我考虑它时,这根本不可能。任何。在一个非常基本的层面上。问题是,类型可以实例化并且无情地引用。这种情况发生的情况并不罕见。更不用说后期绑定了。所有这些意味着尝试分析它引用的所有类型的程序集就像预测未来一样。

编辑2:评论

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

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