2008-11-28 5 views

Respuesta

49

creo que lo más cerca que puede obtener de forma fiable es determinar qué versión del CLR se requiere. Puede hacerlo utilizando ILDASM y mirando el nodo "MANIFEST" o Reflector y mirando la vista de dissembly del nodo "Application.exe" como IL. En ambos casos, hay un comentario que indica la versión de 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".

Éstos son ejemplos de una aplicación .NET WinForms llamado 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 de referencia y busque la referencia con el número de versión más alto.

de nuevo, usando ILDASM mirando a los datos del nodo "manifiesto":

.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 (todavía como IL) para cada referencia en la lista:

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

Por Al buscar 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 instalado para que se ejecute la aplicación. Una vez dicho esto, no lo trataría como 100% confiable, pero no creo que vaya a cambiar pronto.

+3

Desafortunadamente, Microsoft introduce un cambio radical en la técnica anterior. Los ensamblados de .NET 4.5 no se pueden ejecutar en .NET 4 en bruto, y para indicarle a un ensamblado de .NET 4.5, también debe leer System.Runtime.Versioning.TargetFrameworkAttribute. http://www.lextm.com/2013/02/how-to-tell-net-45-only-assemblies.html –

15

Desde el código puede usar Assembly.ImageRuntimeVersion pero al mirar el archivo, probablemente lo mejor que puede hacer es utilizar el reflector y ver a qué versión de mscorlib se hace referencia.

Editar: Aún mejor sería utilizar ildasm, abra su ensamblaje y luego ver el manifiesto para el montaje. La primera línea del manifiesto le dirá la exacta versión de CLR para la que se creó el ensamblado.

+0

Esto está mal. El OP preguntó acerca de la versión de .NET Framework, no de la versión de CLR Runtime. Esta respuesta se dirige al último. Como ejemplo, me estoy ejecutando contra Framework 4.7.2531.0 que utiliza CLR Runtime versión 4.0.30139. ImageRuntimeVersion devuelve la versión de CLR, no la versión de Framework. –

23

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

Ver el panel de propiedades: enter image description here

+1

¡Muy buena herramienta, justo lo que necesitaba! – Surfbutler

+0

¿Qué estaría buscando? –

+1

@BentTranberg agregué una captura de pantalla –

10

Se 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) está instalado 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 ninguna de las banderas hasta que lea cuidadosamente el documentation.

+1

No puedo distinguir entre .Net4 y .Net4.5 – mheyman

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.

+0

No creo que esto sea cierto. Tengo un marco de destino de 4.5 pero uso System.Core 4.0.XXX.XXX –

17

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

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

Usando Notepad, tres décadas de edad, 200 kb de tamaño, herramienta preinstalado:

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

cualquier otro editor/espectador puede abrir archivos binarios también, como Notepad ++ o de TotalCommander gran texto/espectador lister hexagonal.

+0

Esta es la mejor respuesta con diferencia. ¡Gracias! – kjrkvc

+0

Estoy de acuerdo con @kjrkvc, esta es realmente la mejor – Bodhi

+2

Excelente respuesta, y de lejos la más fácil de hacer, aunque usaría Notepad ++ para ello :) – harag

5

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

0

En Linux/OSX/Unix que puede utilizar:

strings that_app.exe | grep 'v2.\|Framework' 
Cuestiones relacionadas