Ich habe eine Sammlung von DLLs (sagen wir 20). Wie finde ich alle DLLs heraus, von denen eine bestimmte DLL (zB DLL A) abhängig ist?Abhängigkeiten aller DLLs herausfinden?
Antwort
Wenn Sie programmgesteuert meinen, verwenden Sie Assembly.GetReferencedAssemblies
.
Sie können das rekursiv verwenden, um alle benötigten Baugruppen zu finden. (So finden Sie die Abhängigkeiten von X, dann die Abhängigkeiten der Abhängigkeiten usw.)
Sie können die Abhängigkeit walker http://www.dependencywalker.com verwenden, um dies herauszufinden. Beachten Sie jedoch den Unterschied zwischen x32 und x64.
Dependency Walker ist ein freies Programm, das durchsucht alle 32-Bit- oder 64-Bit-Windows-Modul (EXE, DLL, OCX, sys, etc.) und baut ein hierarchisches Baumdiagramm aller abhängigen Module.
Da die Frage mit "C#" markiert ist, würde ich annehmen, dass Sie über verwaltete DLLs (Assemblies) sprechen. In diesem Fall ist der dependencywalker nicht nützlich. Wenn Sie das mit einem Programm machen wollen, sind dotPeek von JetBrians und Reflector von RedGate die besten. Oder Sie können sogar den Objektinspektor in Visual Studio verwenden.
Es kann jedoch ein langer Prozess und umständlich sein. Ich würde ein kurzes C# -Programm/F # -Skript schreiben, das Assembly.GetReferencedAssemblies
verwendet, wie Jon erwähnte.
Wenn Sie stattdessen native DLLs-Abhängigkeiten mit einem Programm (C# -Code) untersuchen möchten, müssen Sie die PE-Datei (das MS dll- und exe-Dateiformat) und ihre IAT (Importadressentabelle) untersuchen. Nicht einfach, aber nicht unmöglich ...
würde ich anfangen here on MSDN und here zu PE Abschnitten zu verstehen und verwenden, um eine verwaltete Bibliothek, es zu lesen (es gibt viele, einige aus dem Mono-Projekt einschließlich (ich denke an Cecil , sollte es auch mit einheimischen Binärdateien arbeiten), in der Vergangenheit habe ich this one von der guten John Gough verwendet haben
Alle Antwort-Credits gehen an frühere Autoren für die Verwendung von Assembly.GetReferencedAssemblies
. Dies ist nur eine Schreib-und-Schmiede t C# -Konsolen-App, die ausschließlich für .NET-Assemblys funktioniert. return 0
auf Assemblys, die Sie überprüfen konnten, und wenn sie erfolgreich sind, gibt sie sie an STDOUT aus. Alles andere wird return 1
und eine Art von Fehlerausgabe ausgeben. Sie können das Wesentliche here greifen.
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;
}
}
}
Verbrauch:
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
Ausgang:
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. Obfuscate Winform und seine externen Abhängigkeiten (dlls)
- 2. zirkuläre Abhängigkeiten zwischen DLLs mit Visual Studio
- 3. M2E Fehler beim Laden aller Abhängigkeiten
- 4. So finden Sie eine Liste aller nicht verwalteten DLLs Loadad von meiner verwalteten .net-Anwendung
- 5. Laden benutzerdefinierter DLLs anstelle von ursprünglichen DLLs
- 6. Tool zur Ausgabe aller Module & Abhängigkeiten für Python-Projekt?
- 7. Sollte ich meine DLLs signieren?
- 8. nuget Abhängigkeiten von Abhängigkeiten
- 9. Wo sucht DLLImport nach nicht verwalteten DLLs?
- 10. Wie man Visual Studios Build-System erhält, um nicht verwaltete Abhängigkeiten von verwalteten DLLs zu verstehen?
- 11. Wenn Release-DLLs nicht funktionieren, aber Debug-DLLs tun
- 12. Wie man die Gläser herausfinden kann, von denen die Abhängigkeiten in der pom.xml des Maven abhängen?
- 13. Aktualisieren von GAC dlls
- 14. VSIX dlls mit DllImport
- 15. Debugger-Laufzeit-DLLs entfernen
- 16. Entladen alle qt dlls
- 17. Microsoft.SqlServer.Types.SqlGeography DLLs in GAC
- 18. ASP.net, dlls und webconfigs
- 19. Delay Loading DLLs
- 20. dlls nicht erkannt
- 21. Python-Modul DLLs
- 22. Verschmelzung .net verwaltete dlls
- 23. Wie Abhängigkeiten Abhängigkeiten erhalten?
- 24. Java-System.loadLibrary-Abhängigkeiten
- 25. Get alle DLLS für einen Prozess
- 26. Verweis auf freigegebene DLLs in VS-Bereitstellungsprojekt
- 27. Abhängigkeiten von Abhängigkeiten mit browserify-shim shimmen
- 28. Möglichkeiten, DLLs auf dem neuesten Stand zu halten
- 29. Pip: Abhängigkeiten von Abhängigkeiten installieren
- 30. Wann müssen abhängige DLLs vorhanden sein?
müssen Sie umfassen "System.Reflection verwendet;" – greenfeet
@greenfeet: Nicht unbedingt - Sie könnten 'var assemblies = typeof (Foo) .Assembly.GetReferencedAssemblies();' zum Beispiel verwenden. Im Allgemeinen lohnt es sich nicht, alle Namespaces hinzuzufügen, die von allen Typen verwendet werden, auf die in den Antworten verwiesen wird - insbesondere nicht, wenn Links zu den fraglichen Typen vorhanden sind.Ich gehe davon aus, dass die Leser genug von der C# -Sprache verstehen, um zu wissen, wann eine 'using'-Direktive hinzugefügt werden muss. –
Konnten Sie vermeiden, 'using System.Reflection' für die Abhängigkeiten der Abhängigkeiten hinzuzufügen? Müssten Sie nicht irgendwann Assembly.LoadWithPartialName (oder etwas Ähnliches) aufrufen? – theoski