我有一個DLL的集合(說20)。如何找出一個特定的DLL(比如DLL A)依賴的所有DLL?找出所有DLL的依賴關係嗎?
回答
如果以編程方式使用,請使用Assembly.GetReferencedAssemblies
。
你可以遞歸地使用它來找到你需要的所有程序集。 (所以你找到X的依賴關係,然後依賴關係等)
您可以使用依賴關係walker http://www.dependencywalker.com來解決這個問題。但請注意x32和x64之間的區別。
的Dependency Walker是一個免費的實用程序,它可以掃描任何32位或64位的Windows 模塊(EXE,DLL,OCX,SYS等)和生成的所有從屬模塊的分層樹 圖。
由於問題標記爲「C#」,我會假設你正在談論託管dll(程序集)。在這種情況下,dependencywalker沒有用處。如果你想用程序來做到這一點,好的是JetBrians的dotPeek和RedGate的Reflector。或者你甚至可以在Visual Studio中使用對象檢查器。
但是,它可能是一個漫長的過程和繁瑣的過程。正如Jon所說,我會寫一個簡短的C#程序/ F#腳本,使用Assembly.GetReferencedAssemblies
。
如果您想要使用程序(C#代碼)檢查本機DLL依賴項,則必須檢查PE文件(MS dll和exe文件格式)及其IAT(導入地址表)。不容易,但也不是不可能......
我將開始here on MSDN和here瞭解PE的部分,並使用託管庫讀它(有很多,其中包括一些從Mono項目(我在想Cecil ,它應該與本地二進制太)工作;在過去,我已經從良約翰·高夫使用this one
所有回答的功勞都歸功於以前的作者使用Assembly.GetReferencedAssemblies
。這只是一個寫和僞造t僅適用於.NET程序集的C#控制檯應用程序。 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
- 1. 查找dll依賴關係
- 2. DLL依賴關係
- 3. 查找所有函數依賴關係
- 4. Maven找出依賴關係
- 5. 找不到dll或依賴關係
- 6. SQL查詢獲取所需的DLL的所有依賴關係
- 7. DLL依賴關係 - 在不同的系統上有所不同?
- 8. 瞭解dll依賴關係
- 9. 共享DLL - 依賴關係
- 10. poco netssl dll依賴關係
- 11. 如何查找所有依賴dll
- 12. 創建一個包含所有依賴關係的獨立DLL
- 13. 找出python包的依賴關係
- 14. C#反射 - 加載外部DLL和所有依賴關係
- 15. 解決所有的maven依賴關係
- 16. 依賴關係的nuget依賴關係
- 17. 刪除對DLL的依賴關係
- 18. 缺少kernel32.dll的依賴關係
- 19. COM DLL的依賴關係樹
- 20. C#中的DLL依賴關係
- 21. RAD中的MANIFEST.MF沒有列出所有的依賴關係
- 22. 新的依賴關係React native - gradle clean - 無法解決所有依賴關係
- 23. 查找YouTube依賴關係
- 24. 查找列依賴關係
- 25. 查找AAR依賴關係
- 26. 我有.NET依賴關係嗎?
- 27. 清除所有依賴關係
- 28. Grunt concat所有package.json依賴關係
- 29. 如何找出我的maven pom中有哪些依賴關係具有特定的依賴關係。
- 30. py2exe沒有找到所有依賴關係
您將需要包括 「使用的System.Reflection;」 – greenfeet 2015-07-20 08:52:45
@greenfeet:不一定 - 您可以使用'var assemblies = typeof(Foo).Assembly.GetReferencedAssemblies();'例如。通常,不值得添加所有在答案中引用的類型使用的所有名稱空間 - 特別是當有鏈接到相關類型時。我假設讀者已經足夠了解C#語言以知道何時添加「using」指令。 – 2015-07-20 08:56:03
你可以避免爲依賴關係的依賴添加'使用System.Reflection'嗎?你不需要在某個時候調用Assembly.LoadWithPartialName(或類似的東西)嗎? – theoski 2015-10-09 17:14:38