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

97

Ich habe eine ausführbare Datei und möchte wissen, welche Versionen des .NET Frameworks 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 ausprobiert .)

Sam
quelle
Siehe auch stackoverflow.com/questions/3460982/…
Ruben Bartelink
docs.microsoft.com/en-us/sysinternals/downloads - Process Explorer macht dies sehr gut und einfach zu bedienen, führen Sie es einfach als Admin aus
AquaAlex

Antworten:

55

Ich denke, das Beste, was Sie zuverlässig erreichen können, ist zu bestimmen, welche Version der CLR erforderlich ist. Sie können dies tun, indem Sie ILDASM verwenden und den Knoten "MANIFEST" oder Reflektor 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 "Ziellaufzeitversion".

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

ILDASMUS:

// 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 Assemblys anzeigen, auf die verwiesen wird, und nach der Referenz mit der höchsten Versionsnummer suchen.

Verwenden von ILDASM unter Berücksichtigung der 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
}

Verwenden Sie Reflector, um die Dissambly (immer noch als IL) für jede aufgelistete Referenz zu betrachten:

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

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

Scott Dorman
quelle
4
Leider führt Microsoft eine grundlegende Änderung für die oben genannte Technik ein. .NET 4.5-Assemblys können nicht unter unformatiertem .NET 4 ausgeführt werden. Um einer .NET 4.5-Assembly mitzuteilen, müssen Sie auch System.Runtime.Versioning.TargetFrameworkAttribute lesen. lextm.com/2013/02/how-to-tell-net-45-only-assemblies.html
Lex Li
55

Mit Notepad , drei Jahrzehnte alt, 200 KB groß, vorinstalliertes Tool:

  • offene Bewerbung mit notepad appname.exe,
  • Suche nach dem Wort "Framework",
  • Wiederholen Sie die letzte Suche mit, F3bis .NET Framework,version=vX.Yangezeigt wird
  • Wenn nichts gefunden wurde (Versionen unter 3.0), suchen Sie nach v2.... immer noch 100-mal einfacher als die Installation von Gigabyte Dot Net Analyzer-Tools und Garbage Studios.

Jeder andere Editor / Viewer kann auch Binärdateien öffnen, wie z. B. Notepad ++ oder TotalCommanders großartiger Text- / Hex-Viewer- Lister .

Asain Kujovic
quelle
Dies ist großartig - besonders wenn Sie keinen Zugriff auf Dekompilierungs- / andere Tools haben
Craig
@BentTranberg interessant, kannst du mir irgendwie exe schicken, asainnp bei gmail com.
Asain Kujovic
32

Ein vereinfachterer Ansatz wäre, dotPeek zu verwenden und zu sehen, was im Baum angezeigt wird .

Siehe das Eigenschaftenfenster: Geben Sie hier die Bildbeschreibung ein

Daniel A. White
quelle
22

Mit ILSpy können Sie jetzt das Zielframework einer Assembly 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")]
Tsandhol
quelle
2
Beachten Sie, dass TargetFrameworkAttribute nur in .NET 4.0 hinzugefügt wurde und daher nicht in Assemblys vorhanden ist, die mit .NET 3.5 oder früher kompiliert wurden.
Wai Ha Lee
ILSpy zeigt "Runtime: vXXX" in Kommentaren an, wenn Sie auf den Stammknoten der geladenen Assembly klicken. Ich konnte ein Framework-Projekt der Version 1.1.4322 sehen.
Ryancdotnet
15

Aus dem Code, den Sie verwenden können, Assembly.ImageRuntimeVersionaber wenn Sie sich die Datei ansehen, mscorlibist es wahrscheinlich am besten, den Reflektor zu verwenden und zu sehen, auf welche Version verwiesen wird.

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

Andrew Hare
quelle
3
Das ist falsch. Das OP fragte nach der Version von .NET Framework, nicht nach der Version der CLR Runtime. Diese Antwort spricht letztere an. Als Beispiel verwende ich Framework 4.7.2531.0, das die CLR Runtime-Version 4.0.30139 verwendet. ImageRuntimeVersion gibt die CLR-Version zurück, nicht die Framework-Version.
Tom Baxter
11

Sie können ein Tool namens CorFlags.exe verwenden. Es gibt es seit .NET 2.0 und ich weiß mit Sicherheit, 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. Stellen Sie ihm den Dateipfad zu einem verwalteten Modul (ohne andere Befehlszeilenflags) zur Verfügung, um dessen Header-Informationen anzuzeigen, einschließlich der Version.

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 .

Vince Fedorchak
quelle
1
Kann nicht zwischen .Net4 und .Net4.5 unterscheiden
mheyman
11

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

Sean B.
quelle
2

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

Denis
quelle
Ich denke nicht, dass das wahr ist. Ich habe ein Ziel-Framework von 4.5, benutze aber System.Core 4.0.XXX.XXX
Paul Totzke
1

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

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

Sie können die .NET-Version einer Datei in Windows mit Powershell abrufen. Das folgende Skript;

$path=’.\’
$ErrorActionPreference = "SilentlyContinue"
$files=Get-ChildItem -Path $path -Recurse -include *.dll,*.exe
foreach($file in $files)
{
    $filename = $file.BaseName
    $version = $([System.Reflection.Assembly]::ReflectionOnlyLoadFrom($file.FullName).GetCustomAttributesData() |
                 select-object -ExpandProperty ConstructorArguments | 
                 select-object -ExpandProperty Value | 
                 select-string -Pattern '.NET')
    Write-Output "$filename,$version"
}

liefert das folgende Ergebnis; Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass das Ergebnis die .NET-Version für die exe-Dateien in diesem Ordner extrahiert hat, dies jedoch auch für eine DLL.

Mark Walker
quelle