如何获取应用程序使用的DLL的名称
我正在寻找阅读我的应用程序使用的所有程序集(.dll)的方法。
在标准的C#项目中有“References”文件夹,当它被展开时,我可以读取所有使用的库。
我的目标是以编程方式读取我的解决方案中每个项目使用的所有程序集。
最后,我想看看我编译的* .exe应用程序使用了哪些库。
你看过Assembly.GetReferencedAssemblies
吗?
请注意,您不使用的任何引用都不会最终被发送到元数据中,因此您不会在执行时看到它们。
我之前以递归方式使用GetReferencedAssemblies
来查找命名类型而无需指定程序集。
要正确地执行此操作,您需要遍历程序集,获取依赖项…如果您的exe需要Dll_A,并且Dll_A需要Dll_B(即使exe不引用它),那么您的exe也需要Dll_B。
您可以通过reflection查询(在任何assembly上); 它需要一些工作(特别是为了防止循环引用,这确实发生 ;这是一个从“入口程序集”开始的例子,但这可以很容易地成为任何程序集:
List refs = new List (); Queue pending = new Queue (); pending.Enqueue(Assembly.GetEntryAssembly().GetName()); while(pending.Count > 0) { AssemblyName an = pending.Dequeue(); string s = an.ToString(); if(refs.Contains(s)) continue; // done already refs.Add(s); try { Assembly asm = Assembly.Load(an); if(asm != null) { foreach(AssemblyName sub in asm.GetReferencedAssemblies()) { pending.Enqueue(sub); } foreach (Type type in asm.GetTypes()) { foreach (MethodInfo method in type.GetMethods( BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)) { DllImportAttribute attrib = (DllImportAttribute) Attribute.GetCustomAttribute(method, typeof(DllImportAttribute)); if (attrib != null && !refs.Contains(attrib.Value)) { refs.Add(attrib.Value); } } } } } catch (Exception ex) { Console.Error.WriteLine(ex.Message); } } refs.Sort(); foreach (string name in refs) { Console.WriteLine(name); }
System.Reflection.Assembly []ar=AppDomain.CurrentDomain.GetAssemblies(); foreach (System.Reflection.Assembly a in ar) { Console.WriteLine("{0}", a.FullName); }
您可以使用AppDomain.GetAssemblies 。
但这将在您的应用程序中显式或隐式使用所有程序集。
如果您有一个Assembly
对象,则可以在其上调用GetReferencedAssemblies()
以获取程序集使用的任何引用。 要获取当前运行的项目使用的程序集列表,您可以使用:
System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies()
我想你可以使用:
AssemblyName[] assemblies = this.GetType().Assembly.GetReferencedAssemblies();