¿Cómo saber qué versión de .NET Framework necesita ejecutar un ejecutable?

97

Tengo un archivo ejecutable y me gustaría saber qué versiones de .NET framework necesita este archivo para ser iniciado.

¿Existe una manera fácil de encontrar esta información en algún lugar?

(Hasta ahora probé ILDASM y DUMPBIN sin suerte).

Sam
fuente
Véase también stackoverflow.com/questions/3460982/…
Ruben Bartelink
docs.microsoft.com/en-us/sysinternals/downloads - Process Explorer hace esto muy bien y es fácil de usar, simplemente ejecútelo como administrador
AquaAlex

Respuestas:

55

Creo que lo más cercano que puede obtener de manera confiable es determinar qué versión de CLR se requiere. Puede hacer esto usando ILDASM y mirando el nodo "MANIFEST" o Reflector y mirando la vista desmontable del nodo "Application.exe" como IL. En ambos casos hay un comentario que indica la versión CLR. En ILDASM, el comentario es "// Versión de metadatos" y en Reflector el comentario es "Versión de tiempo de ejecución de destino".

A continuación, se muestran ejemplos de una aplicación .NET WinForms denominada 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
}

Reflector:

.module WindowsFormsApplication1.exe
.subsystem 0x0002
// MVID: {CA3D2090-16C5-4899-953E-4736D6BC0FA8}
// Target Runtime Version: v2.0.50727

También puede mirar la lista de ensamblajes referenciados y buscar la referencia con el número de versión más alto.

Nuevamente, usando ILDASM mirando los datos del nodo "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
}

Y usando Reflector, mirando el dissambly (aún como IL) para cada referencia enumerada:

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

Al encontrar la referencia con los metadatos de la versión más alta, puede determinar de qué versión del Framework proviene esa referencia, lo que indicaría que necesita la misma versión del Framework instalada para que se ejecute la aplicación. Dicho esto, no trataría esto como 100% confiable, pero no creo que vaya a cambiar pronto.

Scott Dorman
fuente
4
Desafortunadamente, Microsoft introduce un cambio radical para la técnica anterior. Los ensamblados .NET 4.5 no se pueden ejecutar en .NET 4 sin formato y, para indicarle a un ensamblado .NET 4.5, también debe leer System.Runtime.Versioning.TargetFrameworkAttribute. lextm.com/2013/02/how-to-tell-net-45-only-assemblies.html
Lex Li
56

Usando el Bloc de notas , tres décadas de antigüedad, 200 kb de tamaño, herramienta preinstalada:

  • aplicación abierta con notepad appname.exe,
  • buscar la palabra "marco",
  • repite la última búsqueda con F3hasta que .NET Framework,version=vX.Yaparezca
  • si no se encuentra nada (versiones por debajo de 3.0) busque v2.... aún 100 veces más fácil que instalar gigabytes de herramientas de análisis de red de puntos y estudios de basura.

Cualquier otro editor / visor también puede abrir archivos binarios, como Notepad ++ o el gran visualizador de texto / hexadecimal de totalCommander .

Asain Kujovic
fuente
Esto es genial, especialmente si no tiene acceso a descompilar / otras herramientas
Craig
@BentTranberg interesante, ¿puedes enviarme un exe de alguna manera, asainnp a gmail com.
Asain Kujovic
32

Un enfoque más simplificado sería usar dotPeek y ver qué aparece en el árbol.

Ver el panel de propiedades: ingrese la descripción de la imagen aquí

Daniel A. White
fuente
22

Ahora puede usar ILSpy para examinar el marco de destino de un ensamblado. Después de cargar el ensamblaje, haga clic en la raíz del nodo del ensamblaje y podrá encontrar la información en la declaración TargetFramework:

[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
tsandhol
fuente
2
Tenga en cuenta que TargetFrameworkAttribute solo se agregó en .NET 4.0, por lo que no estará presente en ensamblados compilados con .NET 3.5 o anterior.
Wai Ha Lee
ILSpy muestra "Runtime: vXXX" en los comentarios al hacer clic en el nodo raíz del ensamblaje cargado. Pude ver un proyecto de marco v1.1.4322.
ryancdotnet
15

Desde el código que puede usar, Assembly.ImageRuntimeVersionpero mirando el archivo probablemente lo mejor sería usar reflector y ver a qué versión mscorlibse hace referencia.

Editar: incluso mejor sería usar ildasm , abrir su ensamblaje y luego ver el manifiesto del ensamblaje. La primera línea del manifiesto le indicará la versión exacta de CLR para la que se creó el ensamblado.

Andrew Hare
fuente
3
Esto está mal. El OP preguntó sobre la versión de .NET Framework, no la versión de CLR Runtime. Esta respuesta aborda el último. Como ejemplo, estoy ejecutando contra Framework 4.7.2531.0 que usa CLR Runtime versión 4.0.30139. ImageRuntimeVersion devuelve la versión CLR, no la versión Framework.
Tom Baxter
11

Puede utilizar una herramienta llamada CorFlags.exe. Ha existido desde .NET 2.0, y estoy seguro de que está incluido en Windows SDK 7.0. De forma predeterminada (en Windows XP Pro) se instala en C: \ Archivos de programa \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exe. Proporcione la ruta del archivo a un módulo administrado (sin ningún otro indicador de línea de comandos) para mostrar su información de encabezado, que incluye la versión.

Tenga en cuenta que esta utilidad está diseñada para modificar el encabezado PE32 de un módulo, por lo que no utilice ninguno de los indicadores hasta que lea la documentación detenidamente.

Vince Fedorchak
fuente
1
No se puede distinguir entre .Net4 y .Net4.5
mheyman
11

Desde la línea de comando: find "Framework" MyApp.exe

Sean B
fuente
2

O simplemente puede averiguar qué referencia de System.Core tiene. Eso le dirá la versión de .NET Framework que está usando esta aplicación. Para 2.0, la versión de System.Core será 2.0.xxx.xxx. Para 3.5, la versión será 3.5.xxx.xxx, etc.

Denis
fuente
No creo que esto sea cierto. Tengo un marco de destino de 4.5 pero uso System.Core 4.0.XXX.XXX
Paul Totzke
2

Puede obtener la versión .NET de un archivo en Windows usando Powershell. El siguiente guión;

$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"
}

proporciona el siguiente resultado; ingrese la descripción de la imagen aquí

Tenga en cuenta que el resultado extrajo la versión .NET para los archivos exe en esa carpeta, pero también hará lo mismo para una dll.

Mark Walker
fuente
1

En Linux / OSX / unix puede usar:

strings that_app.exe | grep 'v2.\|Framework'
Pierz
fuente