Determinar la versión de .NET Framework para DLL
-
27-09-2019 - |
Pregunta
Tengo un viejo DLL que fue compilada en el marco .NET y desplegado. No estoy seguro de qué versión del marco .NET que fue compilado en contra. Me pregunto cómo puedo determinar la versión del marco .NET esta DLL que fue compilada? No puedo confiar en el código fuente, porque creo que se ha actualizado a Visual Studio 2008 y cambiado a la versión 3.5 de .NET Framework.
Solución
Otros consejos
En PowerShell se puede utilizar el siguiente para obtener el tiempo de ejecución de destino:
$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).ImageRuntimeVersion
Adapté esto a partir de PowerShell Ben Griswold respuesta .
Si quieres saber la versión del marco de destino especificado en Visual Studio, utilice:
$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).CustomAttributes |
Where-Object {$_.AttributeType.Name -eq "TargetFrameworkAttribute" } |
Select-Object -ExpandProperty ConstructorArguments |
Select-Object -ExpandProperty value
Usted debe obtener algo como
.NETFramework, versión = v4.5.2
dotPeek es un gran herramienta (libre) para mostrar esta información.
Si usted está teniendo algunos problemas en hacerse con reflector entonces esta es una buena alternativa.
Puede utilizar ILDASM .. .
ildasm.exe C:\foo.dll /metadata[=MDHEADER] /text /noil
y de verificación de la sección de metadatos 'en la salida. Sería algo así:
secciónMetadatos: 0x424a5342, versión: 1.1, extra: 0, versión len: 12, versión: v4.0.30319
La etiqueta 'versión' le dirá la versión de .NET Framework. En el ejemplo anterior es 4.0.30319
Usted tiene algunas opciones: conseguirlo mediante programación, desde el código administrado, el uso Assembly.ImageRuntimeVersion:
Dim a As Assembly = Reflection.Assembly.ReflectionOnlyLoadFrom("C:\path\assembly.dll")
Dim s As String = a.ImageRuntimeVersion
Desde la línea de comandos, a partir de v2.0, ildasm.exe lo mostrará si hace doble clic en "manifiesto" y el aspecto de "versión de metadatos". La determinación de CLR versión de una imagen
de código abierto, libre, sin duda una opción ya que ahora se paga reflector.
Simplemente
var tar = (TargetFrameworkAttribute)Assembly
.LoadFrom("yoursAssembly.dll")
.GetCustomAttributes(typeof(TargetFrameworkAttribute)).First();
Descompilar con ILDASM, y vistazo a la versión de mscorlib que se está haciendo referencia (debe ser más o menos a la derecha en la parte superior).
La expansión de las respuestas aquí, esto puede explotar si hay un ensamblado dependiente. Si tienes suerte y sabes donde las depende (o incluso más suerte, es en la GAC), entonces esto puede ayudar ...
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);
}
Referencia: https: // weblog .west-wind.com / mensajes / 2006 / Dec / 22 / Reflexión-en-problema-Asambleas
Me escribió rápidamente esta aplicación de consola de C # para hacer esto:
https://github.com/stuartjsmith/binarydetailer
Basta con pasar un directorio como parámetro y que hará todo lo posible para decirle el marco neto para cada DLL y EXE allí