如何在引用的程序集中获取所有类型?

无论出于何种原因,我似乎无法获得引用程序集中的类型列表。 不仅如此,我甚至无法进入这个引用的程序集。

我尝试了AppDomain.CurrentDomain.GetAssemblies() ,但它只返回已加载到内存中的程序集。

我尝试了Assembly.GetExecutingAssembly().GetReferencedAssemblies() ,但这只是返回mscorlib。

我错过了什么?

请注意,如果在程序集中实际使用该程序集中的类型(或您使用的类型取决于该程序集中的类型), Assembly.GetReferencedAssemblies仅包含特定程序集。 仅仅在Visual Studio的引用列表中包含程序集是不够的。 也许这解释了你的期望输出的差异? 我注意到,如果您希望能够使用不可能的reflection来获取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加载它,然后基本上按上述步骤枚举该加载程序集中的类型。

我还陷入了必须获取Visual Studio中引用列表中的所有程序集的情况。

我用了以下的工作来完成它。

 var path = AppContext.BaseDirectory; // returns bin/debug path var directory = new DirectoryInfo(path); if (directory.Exists) { var dllFiles = directory.GetFiles("*.dll"); // get only assembly files from debug path } 

GetReferencedAssemblies方法基本上优化了程序集上的发现过程,跳过了主程序集中没有显式引用的程序集。

假设您有一个项目B和一个引用项目B的项目C.现在您创建一个新项目A,它引用了C(而不是B)

当你调用Assembly.Load("C path").GetReferenceAssemblies ,如果你从未引用过类,枚举,接口……那么它将只返回B,这是C程序集的一部分。

作为一种变通解决方案,您可以创建C中存在的类的虚拟实例。

 Assembly.C.Class1 dummyInstance = new Assemply.C.Class1(); 

就个人而言,我使用这个解决方案,以防你需要在Core项目中分离所有接口,并在Core.Proj1中使用Core中使用的接口标记您的类,以便稍后在主程序集中进行发现。 请记住,一旦加载多个程序集,reflection会对性能产生影响,因此不要以在目录上进行发现的解决方案结束并加载所有程序集以获取所需的类型。 因此,从那时起,您可以继续使用@jason建议的代码

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