Bestimmen Sie die .NET Framework-Version für die DLL

137

Ich habe eine alte DLL, die gegen das .NET Framework kompiliert und bereitgestellt wurde. Ich bin nicht sicher, gegen welche Version des .NET Frameworks es kompiliert wurde. Ich frage mich, wie ich feststellen kann, gegen welche Version des .NET-Frameworks diese DLL kompiliert wurde. Ich kann dem Quellcode nicht vertrauen, da ich glaube, dass er auf Visual Studio 2008 aktualisiert und auf .NET Framework Version 3.5 geändert wurde.

mpenrow
quelle

Antworten:

49

Laden Sie es in Reflector und sehen Sie, worauf es verweist?

beispielsweise:

Geben Sie hier die Bildbeschreibung ein

ParmesanCodice
quelle
1
Meine Idee auch, aber wenn ich den Reflektor kenne, wird er sich wahrscheinlich beschweren und ihm ein schönes, unbeschreibliches Fehlersymbol geben.
Leppie
@leppie Sollte kein Problem sein, auch wenn es sich um .NET 1.1 handelt. Ändern Sie einfach Ihre Standard-Baugruppenliste.
ParmesanCodice
Ihre Antwort ist sehr hilfreich, aber ich rate Ihnen, sich nicht blind darauf zu verlassen. Gestern habe ich zu viel Zeit mit meinem eigenen Projekt verbracht, das auf .Net 4.0 ausgerichtet war, von Reflector zur Verwendung von .Net 4.0.3 gemeldet wurde und verwendet werden muss .Net 4.5 von Windows :-) Ich kenne keine andere Methode, um dies für ein Projekt zu überprüfen, als für Quellen - siehe hier: stackoverflow.com/questions/13214503/…
greenoldman
3
Sie können auch die kostenlose Open-Source - Alternative verwenden ILSpy wie bemerkt von Kat Lim Ruiz.
Marcus Mangelsdorf
Diese Antwort hat bei mir funktioniert : stackoverflow.com/a/3461027/2961177 .
ckkkitty
128

In PowerShell können Sie Folgendes verwenden, um die Ziellaufzeit abzurufen:

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).ImageRuntimeVersion

Ich habe dies aus Ben Griswolds Antwort an PowerShell angepasst .

Wenn Sie die in Visual Studio angegebene Zielframeworkversion kennen möchten, verwenden Sie:

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).CustomAttributes |
Where-Object {$_.AttributeType.Name -eq "TargetFrameworkAttribute" } | 
Select-Object -ExpandProperty ConstructorArguments | 
Select-Object -ExpandProperty value

Du solltest so etwas bekommen

.NETFramework, Version = v4.5.2

Swoogan
quelle
4
Diese Antwort ist am hilfreichsten. Alle Windows-Betriebssysteme nach 2003 unterstützen Powershell. Eine Shell, die sofortiges Feedback gibt und keine zusätzliche Anwendungsunterstützung erfordert, wie viele der anderen Antworten vermuten lassen. Ideal für einen "einmaligen" Check einer DLL. Du bist der Mann @swoogan.
Nathan McCoy
1
Ich habe dies für eine DLL getan, die ich mit einer TargetFrameworkVersion von Version 3.5 erstellt habe, und sie hat Version 2.0.50727 zurückgegeben. Was vermisse ich?
BHSPitMonkey
4
@BHSPitMonkey Es gab wirklich nur 4 Laufzeitversionen: 1.0, 1.1, 2.0 und 4.0. .NET 3.0 und 3.5 werden auf CLR Version 2.0 kompiliert. msdn.microsoft.com/en-us/library/bb822049(v=vs.110).aspx
Swoogan
1
Dieses Skript bietet nur RuntimeVersion. Die Frage bezieht sich auf TargetFrameworkversion. Tatsächlich zeigt dieses Skript für alle gegen 2.0, 3.0.3.5 kompilierten Assemblys die Runtime-Version als 2.0.0.0
Kiran Vedula
3
Für mich gibt ReflectionOnlyLoadFrom die ImageRuntimeVersion zurück, aber keine CustomAttributes. Die Verwendung von LoadFrom anstelle von ReflectionOnlyLoadFrom liefert das erwartete Ergebnis. Irgendein Grund? PSVersion 5.1.16299.251 CLRVersion 4.0.30319.42000
Bernard Vander Beken
69

dotPeek ist ein großartiges (kostenloses) Tool, um diese Informationen anzuzeigen .

Wenn Sie Probleme haben, Reflector zu finden, ist dies eine gute Alternative.

Geben Sie hier die Bildbeschreibung ein

wal
quelle
4
Zu Ihrer Information, ich habe aufgrund eines Problems von DotPeek zu JustDecompile gewechselt: Wenn Sie "bestimmte Version = falsch" auswählen, zeigt DotPeek eine leere Version an und JustDecompile zeigt die richtige Version an. Es hat sich für mich gelohnt, zu wechseln.
Asche999
Großartig - genau das getan, was ich wollte, ohne eine Testversion für Reflector zu installieren.
Bernhardrusch
49

Sie können ILDASM verwenden ...

ildasm.exe C:\foo.dll /metadata[=MDHEADER] /text /noil

und suchen Sie in der Ausgabe nach dem Abschnitt 'Metadaten'. Es wäre ungefähr so:

Metadatenabschnitt: 0x424a5342, Version: 1.1, Extra: 0, Version Len: 12, Version: v4.0.30319

Das Tag 'version' zeigt Ihnen die .NET Framework-Version an. Im obigen Beispiel ist es 4.0.30319

Josh Stodola
quelle
3
Was suche ich hier? Bedeutet das .NET 4.0? // Metadata section: 0x424a5342, version: 1.1, extra: 0, version len: 12, versio n: v4.0.30319
PeterX
Ja, für .NET 2 erhalte ich Folgendes: // Metadatenabschnitt: 0x424a5342, Version: 1.1, extra: 0, Version len: 12, Version: v2.0.50727
Simon
17

Sie haben einige Optionen: Um es programmgesteuert aus verwaltetem Code abzurufen, verwenden Sie Assembly.ImageRuntimeVersion:

Dim a As Assembly = Reflection.Assembly.ReflectionOnlyLoadFrom("C:\path\assembly.dll")
Dim s As String = a.ImageRuntimeVersion

In der Befehlszeile ab Version 2.0 zeigt ildasm.exe dies an, wenn Sie auf "MANIFEST" doppelklicken und nach "Metadatenversion" suchen. Bestimmen der CLR-Version eines Bildes

Ben Griswold
quelle
Wie bekomme ich ImageRuntimeVersion für CurrentAppDomain?
Kiquenet
17

Verwenden Sie ILSpy http://ilspy.net/

Open Source, kostenlos, definitiv eine Option, da jetzt Reflektor bezahlt wird.

Kat Lim Ruiz
quelle
15

Einfach einfach

var tar = (TargetFrameworkAttribute)Assembly
          .LoadFrom("yoursAssembly.dll")
          .GetCustomAttributes(typeof(TargetFrameworkAttribute)).First();
stenly
quelle
1
Ich weiß nicht, warum dies abgelehnt wurde, aber ich kann das Snippet ausführen (ein Verweis auf System.Runtime.Versioning ist erforderlich) und die Ausgabe erfolgreich abrufen (dies ist von LINQPad): TypeId typeof (TargetFrameworkAttribute) FrameworkName .NETFramework, Version = v4.0 FrameworkDisplayName .NET Framework 4
Sudhanshu Mishra
Dieser Code ruft nicht die Vollversion des Frameworks ab. "4.0" ist gut zu wissen, aber "v4.0.30319" wäre nützlicher, wenn Sie beispielsweise versuchen würden, zu RegAsm.exe zu gelangen. Die vollständigeren Versionsinformationen finden Sie in: string tar = Assembly.LoadFrom (@ "myAssembly.dll"). ImageRuntimeVersion;
Martin
Dies scheint der richtige Ansatz zu sein. Gibt es Umstände, unter denen auf eine Assembly dieses Attribut möglicherweise nicht angewendet wird? Ich habe es mit einer .NET Core-Assembly getestet und es gibt Netcore und die Versionsnummer korrekt an.
Adam Naylor
Das funktioniert bei mir nicht. Das GetCustomAttributeshat keine TargetFrameworkAttribute. ImageRuntimeVersion funktioniert jedoch einwandfrei und ruft die richtige CLR ab, für die die Binärdatei erstellt wurde. Ich benötige die Ziel-Framework-Version, für die es erstellt wurde.
Shameel Mohamed
13

Eine weitere Option über Visual Studio: Fügen Sie jedem Projekt einen Verweis auf die DLL hinzu. Klicken Sie dann mit der rechten Maustaste auf den neuen Verweis und klicken Sie auf Eigenschaften. In der Laufzeitversion können Sie sehen, wonach Sie suchen:

Geben Sie hier die Bildbeschreibung ein

lingo_journey
quelle
Ich denke, diese Frage stellt sich nicht die Frage, wann in Visual Studio auf eine DLL verwiesen wird, sondern eine alte .NET-DLL, die auf Ihrem PC herumliegt.
Asche999
7
Diese Antwort zeigt an, dass Sie einen Verweis auf jede alte .NET-DLL hinzufügen können, die auf Ihrem PC herumliegt, und eine der Eigenschaften des Elements unter den Verweisen, die dieser DLL entsprechen, ist die "Laufzeitversion".
ALEXintlsos
8

Dekompilieren Sie es mit ILDASM und sehen Sie sich die Version von mscorlib an, auf die verwiesen wird (sollte ganz oben stehen).

Leppie
quelle
4

Der einfachste Weg: Öffnen Sie einfach die DLL in einem beliebigen Texteditor. Schauen Sie sich eine der letzten Zeilen an: Geben Sie hier die Bildbeschreibung ein

cedenbal
quelle
Die beste Option unter allen
Sisir
2
Dies funktioniert jedoch nicht für DLLs, die vor .Net 3.0
Sisir
2

Ich habe schnell diese C # -Konsolen-App geschrieben, um dies zu tun:

https://github.com/stuartjsmith/binarydetailer

Übergeben Sie einfach ein Verzeichnis als Parameter und es wird sein Bestes tun, um Ihnen das Netz-Framework für jede DLL und Exe dort mitzuteilen

stuartjsmith
quelle
Gibt gute detaillierte Informationen; Es ist eine Befehlszeilen-App. Sie müssen ihm den Verzeichnisnamen in der Befehlszeile übergeben.
Philu
2

" Detect It Easy ", auch bekannt als DiE, ist ein Programm zur Bestimmung von Dateitypen. Funktioniert mit DLL-Dateien oder anderen (EXE-) Dateien. Absolut kostenlos für den kommerziellen und nichtkommerziellen Gebrauch.

Geben Sie hier die Bildbeschreibung ein

20AMax
quelle
0

Wenn Sie DotPeekaus JetBrains, können Sie es sehen in Assembly Explorer.

Kannst du diesen Screenshot sehen?  Ich bin nicht:(

Sam Sch
quelle
0

Wenn Sie die Antworten hier erweitern, kann dies bei einer abhängigen Baugruppe explodieren. Wenn Sie Glück haben und wissen, wo der Abhängige ist (oder noch glücklicher, es ist im GAC), kann dies helfen ...

using System.Reflection;
using System.Runtime.Versioning;
// ...
{
    AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
    var asm = System.Reflection.Assembly.LoadFrom(@"C:\Codez\My.dll");
    var targetFrameAttribute = asm.GetCustomAttributes(true).OfType<TargetFrameworkAttribute>().FirstOrDefault();
    targetFrameAttribute.Dump();
}

Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
    var name = args.Name;

    if (name.StartsWith("Depends"))
        return System.Reflection.Assembly.ReflectionOnlyLoadFrom(@"C:\Codez\Depends.dll");

    return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
}

Referenz: https://weblog.west-wind.com/posts/2006/Dec/22/Reflection-on-Problem-Assemblies

CAD-Typ
quelle