Подтвердить что ты не робот

Определить версию сборки (CLR) сборки

Из командной строки (или каким-либо образом на самом деле), как я могу определить, какая версия CLR .NET требуется сборка?

Мне нужно определить, требует ли сборка 2.0 или 4.0 версии CLR.

4b9b3361

Ответ 1

ildasm.exe покажет его, если вы дважды щелкните "МАНИФЕСТ" и найдите "версию метаданных". По умолчанию это версия, с которой было скомпилировано изображение.

Ответ 2

class Program {
  static void Main(string[] args) { 
      System.Console.WriteLine(
             System.Reflection.Assembly.LoadFrom(args[0]).ImageRuntimeVersion);
  }
}

Скомпилируйте и запустите указанное приложение в последней платформе .NET Framework (поскольку более ранняя среда CLR может не иметь возможности загружать сборки, требующие новой CLR) и запускать ее, передавая путь к сборке, которую вы хотите проверить, в качестве аргумента командной строки.

Ответ 3

Одно уточнение...

Проблема со всеми упомянутыми методами заключается в том, что они вернут версию 4.0, если сборка была скомпилирована против .NET framework 4.0, 4.5 или 4.5.1.

Способ определения этой версии программно во время выполнения использует System.Runtime.Versioning.TargetFrameworkAttribute для данной сборки, например

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

Вернет

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

Ответ 4

Здесь PowerShell эквивалент кода .NET, предложенный в другом ответе. Использование PowerShell означает, что вы можете пропустить несколько шагов, например, создание и компиляция сборки.

В командной строке PowerShell запустите следующее:

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

По умолчанию PowerShell использует среду выполнения .NET v2, поэтому вы получите исключение для ассемблеров, нацеленных на v4. Вопрос о переполнении стека Как запустить PowerShell с помощью среды .NET 4? детализирует методы для изменения, если это необходимо.

Ответ 5

Из командной строки

DUMPBIN ваш dll/exe/CLRHEADER

Ответ 6

Я бы предложил использовать ReflectionOnlyLoadFrom() insted из LoadFrom()

У этого есть преимущество, что он может загружать сборки x64 и ia64 при работе на машине x86, тогда как LoadFrom() не сможет этого сделать.

Хотя он по-прежнему не загрузит сборки .Net 4.0 из 2.0 powershell.

Ответ 7

Как предложила @mistika, лучше использовать ReflectionOnlyLoadFrom(), а не LoadFrom(). Недостатком этого является то, что вызов GetCustomAttributes() на сборке, загруженной с помощью ReflectionOnlyLoadFrom(), вызывает исключение. Вы должны вызвать 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);

Ответ 8

Очень хороший инструмент - JustDecompile от Telerik. Вы можете открывать сборки, и инструмент показывает, нацелены ли они на 4.5, 4.5.1 или 4.6

Ответ 9

Если вы хотите включить результат в script, я рекомендую использовать вывод текста ildasm.exe, а затем grep "Version String" из вывода.

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

Примечание. Я включаю команду ', поэтому команда find не распознает "Длина строки строки"

Ответ 10

Попробуйте выполнить информацию о сборке, чтобы получить версию сборки, которая сообщает вам о версии CLR, а также другую информацию такие как параметры компиляции, Целевой процессор и ссылки:

введите описание изображения здесь