it-swarm.com.de

Wie kann ich herausfinden, welche Version von .NET Framework eine ausführbare Datei ausführen muss?

Ich habe eine ausführbare Datei und würde gerne wissen, welche Versionen von .NET Framework diese Datei gestartet werden muss.

Gibt es eine einfache Möglichkeit, diese Informationen irgendwo zu finden?

(Bisher habe ich ILDASM und DUMPBIN ohne Glück versucht.)

84
Sam

Ich denke, das, was Sie am besten erreichen können, ist festzustellen, welche Version vonCLRbenötigt wird. Sie können dies tun, indem Sie ILDASM verwenden, den Knoten "MANIFEST" oder Reflector betrachten und die Zerlegungsansicht des Knotens "Application.exe" als IL betrachten. In beiden Fällen gibt es einen Kommentar, der die CLR-Version angibt. In ILDASM lautet der Kommentar "// Metadatenversion" und in Reflector der Kommentar "Target Runtime Version".

Hier sind Beispiele für eine .NET WinForms-Anwendung mit dem Namen WindowsFormsApplication1.exe:

ILDASM:

// Metadata version: v2.0.50727
.Assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 2:0:0:0
}
.Assembly extern System
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 2:0:0:0
}

Reflektor:

.module WindowsFormsApplication1.exe
.subsystem 0x0002
// MVID: {CA3D2090-16C5-4899-953E-4736D6BC0FA8}
// Target Runtime Version: v2.0.50727

Sie können auch die Liste der referenzierten Baugruppen anzeigen und nach der Referenz mit der höchsten Versionsnummer suchen. 

Wieder unter Verwendung von ILDASM mit Blick auf die Knotendaten "MANIFEST":

.Assembly extern System.Drawing
{
  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )                         // .?_....:
  .ver 2:0:0:0
}
.Assembly extern System.Core
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 3:5:0:0
}

Und verwenden Sie Reflector, indem Sie für jede aufgelistete Referenz das Disambly (immer noch als IL) betrachten:

.Assembly extern System.Core
{
    .ver 3:5:0:0
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}

Durch Auffinden der Referenz mit den Metadaten der höchsten Version können Sie feststellen, von welcher Version des Frameworks diese Referenz stammt. Dies bedeutet, dass Sie dieselbe Version des Frameworks benötigen, das für die Ausführung der Anwendung erforderlich ist. Davon abgesehen, würde ich das nicht als 100% zuverlässig betrachten, aber ich denke nicht, dass sich dies bald ändern wird.

52
Scott Dorman

Verwenden Sie Notepad , drei Jahrzehnte alt, 200kb groß, vorinstalliertes Werkzeug:

  • anwendung mit notepad appname.exe öffnen, 
  • suche nach Word "Rahmen",
  • wiederholen Sie die letzte Suche mit F3, bis .NET Framework,version=vX.Y angezeigt wird
  • wenn nichts gefunden wird (Versionen unter 3.0), suchen Sie nach v2. ... immer noch 100-mal einfacher als Gigabytes von Dot Net Analyzer-Tools und Müllstudios.

Jeder andere Editor/Viewer kann auch Binaries öffnen, wie Notepad ++ oder den großartigen Text/Hex-Viewer lister von totalCommander.

34
Asain Kujovic

Ein vereinfachter Ansatz wäre die Verwendung von dotPeek und das Anzeigen der Baumstruktur.

Siehe Eigenschaftenfenster:  enter image description here

27
Daniel A. White

Sie können jetzt ILSpy verwenden, um das Zielgerüst einer Assembly zu untersuchen. Klicken Sie nach dem Laden der Assembly auf das Stammverzeichnis des Assemblyknotens. Die Informationen finden Sie unter der TargetFramework-Deklaration:

[Assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
19
tsandhol

Vom Code aus können Sie Assembly.ImageRuntimeVersion verwenden. Wenn Sie sich jedoch die Datei ansehen, ist es wahrscheinlich am besten, Reflector zu verwenden und zu sehen, auf welche Version von mscorlib verwiesen wird.

Edit: Noch besser wäre es, ildasm zu verwenden, die Assembly zu öffnen und das Manifest für die Assembly anzuzeigen. In der ersten Zeile des Manifests wird die genaue-Version der CLR angegeben, für die die Assembly erstellt wurde.

15
Andrew Hare

Sie können ein Tool namens CorFlags.exe verwenden. Es gibt es seit .NET 2.0 und ich weiß genau, dass es im Windows SDK 7.0 enthalten ist. Standardmäßig (unter Windows XP Pro) wird es unter C:\Programme\Microsoft SDKs\Windows\v7.0A\bin\CorFlags.exe installiert. Geben Sie ihm den Dateipfad zu einem verwalteten Modul (ohne weitere Befehlszeilenflags) an, um die Header-Informationen anzuzeigen, die die Version enthalten.

Beachten Sie, dass dieses Dienstprogramm den PE32-Header eines Moduls ändern soll. Verwenden Sie daher keine der Flags, bis Sie die Dokumentation sorgfältig gelesen haben.

10
Vince Fedorchak

Über die Befehlszeile: find "Framework" MyApp.exe

7
Sean B

Oder Sie können einfach herausfinden, welche Referenz von System.Core vorhanden ist. Dadurch erfahren Sie, welche .NET Framework-Version diese App verwendet. Für 2.0 ist die Version von System.Core 2.0.xxx.xxx. Für 3.5 ist die Version 3.5.xxx.xxx usw.

2
Denis

Unter Linux/OSX/Unix können Sie Folgendes verwenden:

strings that_app.exe | grep 'v2.\|Framework'
1
Pierz