Determinar la versión del ensamblado del marco (CLR)


Desde la línea de comandos (o por cualquier medio realmente), ¿cómo puedo determinar qué CLR versión a . NET requiere el ensamblaje?

Necesito determinar si un ensamblado requiere la versión 2.0 o 4.0 CLR.

Author: Peter Mortensen, 2010-02-22

11 answers

ildasm.exe lo mostrará si hace doble clic en" MANIFEST "y busca"Metadata version". De forma predeterminada, es la versión con la que se compiló la imagen.

 50
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-22 12:06:13
class Program {
  static void Main(string[] args) { 
      System.Console.WriteLine(
             System.Reflection.Assembly.LoadFrom(args[0]).ImageRuntimeVersion);
  }
}

Compile y ejecute la aplicación anterior bajo el último.NET Framework (ya que un CLR anterior puede no poder cargar ensamblados que requieran un CLR más nuevo) y ejecútelo pasando la ruta al ensamblado que desea verificar como argumento de línea de comandos.

 31
Author: Mehrdad Afshari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-22 12:12:17

Una aclaración...

El problema con todos los métodos mencionados es que devolverán la versión 4.0 si el ensamblado se compiló contra.NET framework 4.0, 4.5 o 4.5.1.

La forma de calcular esta versión programáticamente en tiempo de ejecución es usando el Sistema.Ejecución.Versionado.TargetFrameworkAttribute for the given assembly, for example

using System;
using System.Linq;
using System.Reflection;
using System.Runtime.Versioning;

...    

object[] list = Assembly.GetExecutingAssembly().GetCustomAttributes(true);
var attribute = list.OfType<TargetFrameworkAttribute>().First();

Console.WriteLine(attribute.FrameworkName);
Console.WriteLine(attribute.FrameworkDisplayName);

Volverá

a.FrameworkName ".NETFramework,Version=v4.0"    string
a.FrameworkDisplayName  ".NET Framework 4"      string

a.FrameworkName ".NETFramework,Version=v4.5"    string
a.FrameworkDisplayName  ".NET Framework 4.5"    string

a.FrameworkName ".NETFramework,Version=v4.5.1"  string
a.FrameworkDisplayName  ".NET Framework 4.5.1"  string
 31
Author: Fernando Gonzalez Sanchez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-20 16:41:31

Aquí hay un PowerShell equivalente al código.NET sugerido en otra respuesta. Usar PowerShell significa que puede omitir algunos pasos, como crear y compilar un ensamblado.

En un símbolo del sistema de PowerShell, ejecute lo siguiente:

[System.Reflection.Assembly]::LoadFrom("C:\...\MyAssembly.dll").ImageRuntimeVersion

De forma predeterminada, PowerShell utiliza el tiempo de ejecución de.NET v2, por lo que obtendrá una excepción para los ensamblados dirigidos a v4. Pregunta de desbordamiento de pila ¿Cómo puedo ejecutar PowerShell con el tiempo de ejecución de. NET 4? detalles de los métodos para cambiar eso, si requerir.

 9
Author: Robin Minto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:09:45

Desde la línea de comandos

Descarga tu dll / exe / CLRHEADER

 5
Author: Tinku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-22 12:14:08

Sugeriría usar ReflectionOnlyLoadFrom () en lugar de LoadFrom()

Tiene la ventaja de que puede cargar ensamblajes x64 e ia64 cuando se ejecuta en una máquina x86, mientras que LoadFrom() no lo hará.

Aunque todavía no carga ensamblados.Net 4.0 desde un powershell 2.0.

 4
Author: mistika,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-04 14:20:00

Como sugirió @mistika, es mejor usar ReflectionOnlyLoadFrom() en lugar de LoadFrom(). La desventaja de esto es que llamar a GetCustomAttributes() en un ensamblado cargado con ReflectionOnlyLoadFrom() arroja una excepción. Necesitas llamar a GetCustomAttributesData() en su lugar:

var assembly = Assembly.ReflectionOnlyLoadFrom(assemblyPath);
var customAttributes = assembly.GetCustomAttributesData();
var targetFramework = customAttributes.FirstOrDefault(attr => attr.AttributeType.Equals(typeof(TargetFrameworkAttribute)));

var frameworkName = string.Empty;
var frameworkDisplayName = string.Empty;
if (null != targetFramework)
{
    if(targetFramework.ConstructorArguments.Any())
    {
        // first argument is the name of the framework.
        frameworkName = (string)targetFramework.ConstructorArguments[0].Value;
    }

    // search for a named argument called "FrameworkDisplayName"
    var frameworkDisplayNameArg = targetFramework.NamedArguments.FirstOrDefault(arg => arg.MemberName.Equals("FrameworkDisplayName"));
    if (null != frameworkDisplayNameArg)
    {
        frameworkDisplayName = (string)frameworkDisplayNameArg.TypedValue.Value;
    }
}

Console.WriteLine("Framework Name: " + frameworkName);
Console.WriteLine("Framework Display Name: " + frameworkDisplayName);
 2
Author: Andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-23 13:26:56

Aquí hay un liner de powershell one que mostrará la versión del framework de destino para ensamblajes dirigidos a v4 y superiores.

 Resolve-Path($args) | Select @{N='Assembly'; E={$_ }}, @{N='TargetFramework'; E={(([Reflection.Assembly]::ReflectionOnlyLoadFrom($_).GetCustomAttributesData() | Where-Object { $_.AttributeType -like "System.Runtime.Versioning.TargetFrameworkAttribute" })).NamedArguments.TypedValue}} | Format-Table

Uso:

C:\test\> show-targetfw.ps1 *.dll

Assembly             TargetFramework
--------             --------
C:\test\a.dll        ".NET Framework 4.6.1"
C:\test\b.dll        ".NET Framework 4.5.2"
 2
Author: Anders Forsgren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-29 07:55:33

Una herramienta muy bonita es JustDecompile de Telerik. Puede abrir ensamblados y la herramienta muestra si tienen como objetivo 4.5, 4.5.1 o 4.6

 1
Author: xforfun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-21 15:04:15

Si desea incluir el resultado en un script, le recomiendo usar la salida de texto de ildasm.exe, y luego grep "Cadena de versión" de la salida.

"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe" /text D:\LocalAssemblies\Toolfactory.Core.BaseTypes.dll /noil /headers | find "' Version String"

Tenga en cuenta que incluyo un ' por lo que el comando find no reconoce "Version String Length"

 0
Author: ferarias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-21 15:35:08

Pruebe este ejecutable Información del ensamblado para obtener la versión del ensamblado, que le indica la versión de CLR que requiere, y también otra información tales como Opciones de compilación, Procesador de destino y Referencias:

introduzca la descripción de la imagen aquí

 -1
Author: yantaq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-10 00:19:41