Wie findet man heraus, welche Version des .NET Framework eine ausführbare Datei ausgeführt werden muss?

StackOverflow https://stackoverflow.com/questions/325918

  •  11-07-2019
  •  | 
  •  

Frage

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

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

(Bisher habe ich versucht, ILDASM und DUMPBIN ohne Erfolg).

War es hilfreich?

Lösung

Ich denke, die nächste Sie zuverlässig erhalten können, ist zu bestimmen, welche Version der CLR erforderlich ist. Sie können dies tun, indem ILDASM mit und an dem „manifest“ Knoten oder Reflektor suchen und an dem dissasembly Blick auf dem „Application.exe“ Knoten als IL suchen. In beiden Fällen gibt es einen Kommentar, der den CLR-Version anzeigt. In ILDASM ist der Kommentar "// Metadaten-Version" und in Reflector Kommentar ist "Target Runtime Version".

Hier sind einige Beispiele für eine .NET WinForms-Anwendung namens 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 in der Liste der referenzierten Assemblys suchen und mit der höchsten Versionsnummer für die Referenz suchen.

Auch mit ILDASM an den "manifest" Knotendaten suchen:

.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 Reflektor am dissambly sucht (nach wie vor als IL) für jede Referenz aufgeführt:

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

Durch die Referenz mit dem höchsten Versions Metadaten zu finden, können Sie bestimmen, welche Version des Framework, die Referenz herkommt, was anzeigen würde, dass Sie die gleiche Version des Rahmen für die Anwendung installierte ausführen müssen. Davon abgesehen, würde ich dies nicht als 100% zuverlässig behandeln, aber ich glaube nicht, dass es in absehbarer Zeit ändern wird.

Andere Tipps

Mit Notepad , drei Jahrzehnte alt, 200kb groß, vorinstallierte Tool:

  • offene Anwendung mit notepad appname.exe,
  • Suche nach Wort "Rahmen",
  • Wiederholung letzte Suche mit F3 bis .NET Framework,version=vX.Y erscheint
  • , wenn nichts gefunden (Versionen unter 3.0) für v2. suchen ... noch 100-mal leichter als Gigabyte dot net Analysetools und Müll Studios installieren.

Jeder andere Editor / Betrachter kann Binärdateien öffnen, wie Notepad ++ oder Totalcommander den großen Text / Hex-Viewer lister .

Eine vereinfachte Ansatz wäre zu verwenden dotPeek und sehen, was in dem Baum auftaucht.

Sehen Sie das Fenster Eigenschaften: eingeben Bild Beschreibung hier

Sie können nun ILSpy die Ziel Rahmen einer Baugruppe zu untersuchen. Nach der Montage Laden, klicken Sie auf die Wurzel des Baugruppenknoten, und Sie können die Informationen unter der TargetFramework Erklärung finden:

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

Von Code können Sie verwenden Assembly.ImageRuntimeVersion sondern in der Datei suchen wahrscheinlich das beste, was zu tun wäre, Reflektor zu verwenden und sehen, welche Version von mscorlib verwiesen wird.

Edit: Noch besser wäre es, ein href zu verwenden <= "http://msdn.microsoft.com/en-us/library/aa309387(VS.71).aspx" rel = „noreferrer“> ildasm , öffnen Sie Ihre Montage und zeigen Sie dann das Manifest für die Montage. Die erste Zeile des Manifests wird Ihnen sagen, die genau Version von CLR, dass die Anordnung zur gebaut wurde.

Sie können ein Tool namens CorFlags.exe. Es gibt es schon seit .NET 2.0, und ich weiß sicher, dass es in dem Windows SDK 7.0 enthalten ist. In der Standardeinstellung (unter Windows XP Pro) nach C installiert ist: \ Programme \ Microsoft SDKs \ Windows \ V7.0A \ bin \ CorFlags.exe. Geben Sie es mit dem Dateipfad zu einem verwalteten Modul (ohne andere Befehlszeilen-Flags) seine Header-Informationen angezeigt werden, die die Version enthält.

Beachten Sie, dass dieses Dienstprogramm entwickelt, um die PE32 Header eines Moduls zu ändern, so verwenden Sie bitte nicht von den Fahnen, bis Sie die Dokumentation sorgfältig.

Von der Befehlszeile: find "Framework" MyApp.exe

Oder Sie können einfach herausfinden, welche anhand von System.Core hat. Das wird Ihnen sagen, die Framework-Version dieser App verwendet. Für 2.0 die Version von System.Core wird 2.0.xxx.xxx sein. Für 3.5 wird die Version 3.5.xxx.xxx usw. sein.

Unter Linux / OSX / Unix können Sie:

strings that_app.exe | grep 'v2.\|Framework'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top