无论出于何种原因,我似乎无法获得引用程序集中的类型列表。不仅如此,我甚至无法看到这个参考组件。
我尝试了AppDomain.CurrentDomain.GetAssemblies()
,但它只返回已经加载到内存中的程序集。
我尝试了Assembly.GetExecutingAssembly().GetReferencedAssemblies()
,但这只是返回mscorlib。
我错过了什么?
答案 0 :(得分:59)
请注意,如果您在程序集中实际使用该程序集中的类型(或您使用的类型取决于该程序集中的类型),则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
文件。为此,请查看包含ItemGroup
元素的Reference
元素。
最后,如果你知道一个程序集所在的位置,你可以使用Assembly.LoadFile
加载它,然后基本上按照上面的步骤来枚举那个加载的程序集中的类型。
答案 1 :(得分:0)
我还陷入了必须获取Visual Studio中引用列表中的所有程序集的情况。
我使用了以下工作来完成它。
"auth.add_user",
"auth.add_group",
"auth.add_userproxy",
"auth.change_group",
"auth.change_user",
"auth.delete_permission",
"evidence.view_all_customers"
"contenttypes.add_contenttype",
"evidence.view_all_demands",
"evidence.delete_supplier"
答案 2 :(得分:0)
方法 GetReferencedAssemblies 基本上优化了程序集上的发现过程,跳过了那些在主程序集中没有明确引用的程序集。
让我们说你有一个项目B和一个引用项目B的项目C. 现在,您创建一个新项目A,它引用了C(而不是B)
当你打电话给Assembly.Load("C path").GetReferenceAssemblies
时,如果你从未引用过属于C程序集的类,枚举,接口......,它将只返回B.
作为一种变通方法,您可以创建C中存在的类的虚拟实例。
Assembly.C.Class1 dummyInstance = new Assemply.C.Class1();
就个人而言,我使用此解决方案以防您需要在Core项目中分离所有接口,并在Core.Proj1中使用Core中使用的接口标记您的类,以便稍后在主程序集中进行发现。请记住,一旦加载多个程序集,反射会对性能产生影响,因此不要以在目录上进行发现的解决方案结束并加载所有程序集以获取所需的类型。因此,从那时起,您可以继续使用@jason建议的代码
foreach(var ....)
Assembly assembly = Assembly.Load(assemblyName);
foreach (var type in assembly.GetTypes()) {
Console.WriteLine(type.Name);