2010-02-11 87 views
26

无论出于何种原因,我似乎无法获取引用程序集中的类型列表。不仅如此,我甚至无法看到这个引用的程序集。如何获取引用程序集中的所有类型?

我试过AppDomain.CurrentDomain.GetAssemblies(),但它只返回已经加载到内存中的程序集。我试过Assembly.GetExecutingAssembly().GetReferencedAssemblies(),但这只是返回mscorlib。

我错过了什么?

+1

你想检查一个项目引用的程序集,或者某个地方坐在文件系统上的程序集? – Amy 2010-02-11 03:04:06

+1

我怀疑CLR的实现会使得从所有程序集中获取所有类型是不可能的,因为它们不得不在所有程序集中进行即时编译,但我真的不是那方面的专家,所以你只应该用我的评论作为进一步探索的线索。 – zneak 2010-02-11 03:09:04

+0

@ yodaj007引用的程序集 – AngryHacker 2010-02-11 03:15:11

回答

52

请注意,Assembly.GetReferencedAssemblies只包含特定的程序集,如果您实际在程序集中使用该程序集中的某个类型(或者您使用的类型取决于该程序集中的类型)。仅仅在Visual Studio中的引用列表中包含一个程序集是不够的。也许这解释了你所期望的输出差异?我注意到如果您希望能够使用不可能的反射来获取Visual Studio中引用列表中的所有程序集,程序集的元数据不包含关于给定程序集不依赖于的程序集的任何信息。

这就是说,一旦你检索到的所有引用的程序集的列表类似于下面的东西应该让你枚举这些组件的所有类型:

foreach (var assemblyName in Assembly.GetExecutingAssembly().GetReferencedAssemblies()) { 
    Assembly assembly = Assembly.Load(assemblyName); 
    foreach (var type in assembly.GetTypes()) { 
     Console.WriteLine(type.Name); 
    } 
} 

如果需要被引用的程序集在Visual Studio中,那么你将不得不解析csproj文件。为此,请查看包含Reference元素的ItemGroup元素。

最后,如果您知道程序集所在的位置,则可以使用Assembly.LoadFile加载它,然后按照上述方法进行操作,以枚举该加载程序集中的类型。

+1

这基本上是问题的要点。在使用其中的类型之前,我的应用程序必须首先检查引用的程序集。所以不,它在被检查之后才被使用。 – AngryHacker 2010-02-11 03:17:10

+0

@AngryHacker:好的,我想我明白你在说什么。请参阅我的编辑。让我知道这个澄清是否有帮助。 – jason 2010-02-11 03:20:52

相关问题