我有一组DLL(比方说20)。如何找出一个特定DLL(比如DLL A)所依赖的所有DLL?
答案 0 :(得分:39)
如果您是以编程方式表示,请使用Assembly.GetReferencedAssemblies
。
您可以递归地使用它来查找所需的所有程序集。 (所以你找到了X的依赖关系,然后是依赖关系的依赖关系等等。)
答案 1 :(得分:13)
由于问题标记为“C#”,我假设您正在讨论托管dll(程序集)。在这种情况下,dependencywalker没用。如果你想用程序做到这一点,好的是JetBrians的dotPeek和RedGate的Reflector。或者您甚至可以在Visual Studio中使用对象检查器。
然而,这可能是一个漫长的过程,也很麻烦。我会写一个简短的C#程序/ F#脚本,使用Assembly.GetReferencedAssemblies
,正如Jon所说。
如果您想要使用程序(C#代码)检查本机DLL依赖项,则必须检查PE文件(MS dll和exe文件格式)及其IAT(导入地址表)。不容易,但并非不可能......
我会开始here on MSDN和here来理解PE部分,并使用托管库来阅读它(有很多,包括Mono项目中的一些(我在考虑{{3它也应该与原生二进制文件一起使用);过去我使用了来自好John Gough的Cecil。
答案 2 :(得分:8)
您可以使用依赖性助手http://www.dependencywalker.com来解决这个问题。请注意x32和x64之间的区别。
Dependency Walker是一个免费的实用程序,可以扫描任何32位或64位 Windows模块(exe,dll,ocx,sys等)并构建分层 所有相关模块的树形图。
答案 3 :(得分:6)
所有答案都归功于以前的作者使用Assembly.GetReferencedAssemblies
。这只是一个可以随意使用的C#控制台应用程序,仅适用于.NET程序集。您可以检查的程序集return 0
,成功时将它们输出到STDOUT。其他所有内容都会return 1
并打印某种错误输出。您可以抓住要点here。
using System;
using System.Reflection;
using System.IO;
namespace DotNetInspectorGadget
{
class DotNetInspectorGadget
{
static int Main(string[] args)
{
if(args.GetLength(0) < 1)
{
Console.WriteLine("Add a single parameter that is your" +
" path to the file you want inspected.");
return 1;
}
try {
var assemblies = Assembly.LoadFile(@args[0]).GetReferencedAssemblies();
if (assemblies.GetLength(0) > 0)
{
foreach (var assembly in assemblies)
{
Console.WriteLine(assembly);
}
return 0;
}
}
catch(Exception e) {
Console.WriteLine("An exception occurred: {0}", e.Message);
return 1;
} finally{}
return 1;
}
}
}
用法:
call %cd%\dotnet_inspector_gadget.exe C:\Windows\Microsoft.NET\assembly\GAC_64\Microsoft.ConfigCI.Commands\v4.0_10.0.0.0__31bf3856ad364e35\Microsoft.ConfigCI.Commands.dll
输出:
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
答案 4 :(得分:5)
对于.NET程序集,查看程序集所依赖的程序集的一个很棒的工具是AsmSpy。
答案 5 :(得分:0)
如果您想要DLL(文件),那么Assembly.GetReferencedAssemblies
也将返回.Net Framework程序集。
这是一个简单的代码片段,它将获取它可以在当前目录中找到的dll(还包括一些其他相关文件):
private readonly string[] _extensions = { ".dll", ".exe", ".pdb", ".dll.config", ".exe.config" };
private string[] GetDependentFiles(Assembly assembly)
{
AssemblyName[] asm = assembly.GetReferencedAssemblies();
List<string> paths = new List<string>(asm.Length);
for (int t = asm.Length - 1; t >= 0; t--)
{
for (int e = _extensions.Length - 1; e >= 0; e--)
{
string path = Path.GetFullPath(asm[t].Name + _extensions[e]);
if (File.Exists(path)) paths.Add(path);
}
}
return paths.ToArray();
}
您可以这样称呼它:MessageBox.Show(string.Join("\r\n", GetDependentFiles(Assembly.GetEntryAssembly())));