Determine la versión del armazón (CLR) del ensamblaje

Desde la línea de comandos (o de alguna manera realmente), ¿cómo puedo determinar qué versión CLR requiere un ensamblado .NET ?

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

ildasm.exe lo mostrará si hace doble clic en “MANIFEST” y busca “Metadata version”. Por defecto, es la versión contra la que se compiló la imagen.

 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 antiguo puede no ser capaz de cargar ensamblados que requieren un CLR más nuevo) y ejecútelo pasando la ruta al ensamblado que desea verificar como el argumento de línea de comando.

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 descubrir esta versión mediante progtwigción en tiempo de ejecución es usar System.Runtime.Versioning.TargetFrameworkAttribute para el ensamblado dado, por ejemplo

 using System; using System.Linq; using System.Reflection; using System.Runtime.Versioning; ... object[] list = Assembly.GetExecutingAssembly().GetCustomAttributes(true); var attribute = list.OfType().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 

Aquí hay un equivalente de PowerShell del código .NET sugerido en otra respuesta. El uso de PowerShell significa que puede omitir algunos pasos, como crear y comstackr un ensamblaje.

En un indicador de PowerShell, ejecute lo siguiente:

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

De manera predeterminada, PowerShell usa el tiempo de ejecución de .NET v2, por lo que obtendrá una excepción para los ensamblados que se dirijan a v4. Pregunta de desbordamiento de stack ¿ Cómo puedo ejecutar PowerShell con .NET 4 runtime? detalla los métodos para cambiar eso, si es necesario.

Desde línea de comando

DUMPBIN su dll / exe / CLRHEADER

Sugeriría usar ReflectionOnlyLoadFrom () insted 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 podrá hacerlo.

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

Aquí hay un trazador de líneas de powershell que mostrará la versión del marco de destino para ensamblajes que apuntan a v4 y superior.

  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 

utilizar:

 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" 

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

 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); 

Una herramienta muy buena es JustDecompile de Telerik. Puede abrir conjuntos y la herramienta muestra si están orientados a 4.5, 4.5.1 o 4.6

Si desea incluir el resultado en una secuencia de comandos, le recomiendo que use la salida de texto de ildasm.exe y luego grep “Version String” 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 ‘para que el comando find no reconozca la “Longitud de cadena de versión”

Pruebe este ejecutable de información de ensamblaje para obtener la versión de ensamblado, que le indica la versión de CLR que necesita, y también otra información como opciones de comstackción, procesador de destino y referencias:

enter image description here