Determinare la versione di .NET Framework per dll
-
27-09-2019 - |
Domanda
Ho una vecchia dll che è stato compilato contro il framework .NET e implementato. Non sono sicuro di quale versione del framework .NET è stato compilato contro. Mi chiedo come posso determinare la versione di .NET framework questa dll è stato compilato contro? Non posso fidarmi il codice sorgente perché credo che è stato aggiornato a Visual Studio 2008 e modificato per framework .NET versione 3.5.
Soluzione
Altri suggerimenti
In PowerShell è possibile utilizzare il seguente per ottenere il runtime di destinazione:
$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).ImageRuntimeVersion
mi sono adattato a questo PowerShell dal di Ben Griswold risposta .
Se vuoi conoscere la versione framework di destinazione specificata in Visual Studio, uso:
$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).CustomAttributes |
Where-Object {$_.AttributeType.Name -eq "TargetFrameworkAttribute" } |
Select-Object -ExpandProperty ConstructorArguments |
Select-Object -ExpandProperty value
Si dovrebbe ottenere qualcosa di simile
.NETFramework, Version = v4.5.2
dotPeek è un grande (gratuito) strumento per mostrare queste informazioni.
Se si hanno alcuni problemi entrare in possesso di riflettore allora questa è una buona alternativa.
È possibile utilizzare ILDASM .. .
ildasm.exe C:\foo.dll /metadata[=MDHEADER] /text /noil
e di controllo per la sezione 'Metadati' in uscita. Sarebbe qualcosa di simile:
sezioneMetadata: 0x424a5342, Versione: 1.1, extra: 0, versione len: 12, versione: v4.0.30319
Il tag 'versione' vi dirà la versione di .NET Framework. Nell'esempio sopra è 4.0.30319
Hai alcune opzioni: per ottenere a livello di codice, dal codice gestito, l'uso Assembly.ImageRuntimeVersion:
Dim a As Assembly = Reflection.Assembly.ReflectionOnlyLoadFrom("C:\path\assembly.dll")
Dim s As String = a.ImageRuntimeVersion
Dalla riga di comando, a partire dal v2.0, ildasm.exe mostrerà se si fa doppio clic su "PALESE" e cercare "la versione metadati". determinazione di un'immagine CLR versione
open source, libero, sicuramente un'opzione dal momento che ora riflettore viene pagato.
Basta semplicemente
var tar = (TargetFrameworkAttribute)Assembly
.LoadFrom("yoursAssembly.dll")
.GetCustomAttributes(typeof(TargetFrameworkAttribute)).First();
Decompile con ILDASM, e un'occhiata alla versione di mscorlib che viene fatto riferimento (dovrebbe essere più o meno a destra in alto).
Ampliando le risposte qui, questo può far saltare in aria se c'è un assembly dipendente. Se siete fortunati e si sa dove le è dipendente (o anche più fortunato, è nel GAC), allora questo può aiutare ...
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);
}
Riferimento: https: // blog .west-wind.com / messaggi / 2006 / Dic / 22 / Riflessione-on-Problem-Assemblee
ho scritto in fretta questo C # console app per fare questo:
https://github.com/stuartjsmith/binarydetailer
È sufficiente passare una directory come parametro e che farà del suo meglio per dire la net framework per ogni dll e exe in là