Pregunta

Tengo un archivo ejecutable y me gustaría saber qué versiones de .NET Framework necesita iniciar este archivo.

¿Hay alguna manera fácil de encontrar esta información en alguna parte?

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

¿Fue útil?

Solución

Creo que lo más cercano que puede obtener de manera confiable es determinar qué versión del CLR se requiere. Puede hacerlo utilizando ILDASM y mirando el " MANIFEST " nodo o Reflector y mirando la vista de desensamblaje del " Application.exe " nodo 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".

Estos son 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 ensamblados referenciados y buscar la referencia con el número de versión más alto.

Nuevamente, usando ILDASM mirando el " MANIFEST " datos de nodo:

.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 desmontaje (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 cambie pronto.

Otros consejos

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

  • aplicación abierta con notepad appname.exe ,
  • búsqueda de la palabra " marco " ;,
  • repita la última búsqueda con F3 hasta que aparezca .NET Framework, version = vX.Y
  • si no se encuentra nada (versiones inferiores a la 3.0) busque v2. ... aún 100 veces más fácil que instalar gigabytes de herramientas de analizador de red de puntos y estudios de basura.

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

Un enfoque más simplificado sería utilizar dotPeek y ver qué se muestra en el árbol.

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

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 de TargetFramework:

[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]

Desde el código puede usar Assembly. ImageRuntimeVersion pero al mirar el archivo, probablemente lo mejor sería usar el reflector y ver qué versión de mscorlib está siendo referenciada.

Editar: Aún mejor sería usar ildasm , abra su ensamblaje y luego vea 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.

Puede usar una herramienta llamada CorFlags.exe. Ha existido desde .NET 2.0, y estoy seguro de que está incluido en el SDK 7.0 de Windows. Por defecto (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, así que no use ninguno de los indicadores hasta que lea documentación cuidadosamente.

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

O simplemente puede averiguar qué referencia de System.Core tiene. Eso le dirá la versión de .NET Framework que esta aplicación está usando. 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.

En Linux / OSX / unix puede usar:

strings that_app.exe | grep 'v2.\|Framework'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top