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

Из командной строки (или любым другим способом), как я могу определить, какая CLR версия < требуется сборка href = "http://en.wikipedia.org/wiki/.NET_Framework" rel = "noreferrer">. NET?

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


person Klaus Byskov Pedersen    schedule 22.02.2010    source источник


Ответы (12)


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

person Darin Dimitrov    schedule 22.02.2010
comment
Чтобы открыть его, возможно, нажмите Win-Start, введите «prompt» и откройте командную строку разработчика Visual-Studio для VS XXXX. Затем вы можете использовать ildasm через командную строку или ввести ildasm.exe, чтобы открыть пользовательский интерфейс и использовать его, как описано в этом ответе. Я нашел «[mscorlib] System.Runtime.Versioning.TargetFrameworkAttribute ::. Ctor (string)», который включает версию фреймворка. (Возможно, разверните окно. Правая сторона Hex-Value - это его ASCII-интерпретация) - person MichiBack; 29.11.2017

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

Проблема со всеми упомянутыми методами заключается в том, что они вернут версию 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
person Fernando Gonzalez Sanchez    schedule 04.09.2013
comment
Пробовал с программой, скомпилированной из командной строки csc, не получилось (нет TargetFrameworkAttribute). КСТАТИ. ваш код можно упростить до: System.Runtime.Versioning.TargetFrameworkAttribute a = list.OfType<System.Runtime.Versioning.TargetFrameworkAttribute>().First(); - person 0xF; 08.07.2014
comment
Он доступен только в .NET 4.0 и выше, и да, код можно упростить. - person Fernando Gonzalez Sanchez; 08.07.2014
comment
Visual Studio устанавливает версию .NET в csproj, если вы компилируете один файл .cs, попробуйте создать для него csproj и запустите, например, msbuild myproject.csproj / p: Configuration = Debug / p: Platform = Any CPU - person Fernando Gonzalez Sanchez; 09.07.2014
comment
Конечно, это не сработает для сборок, скомпилированных для версий ‹4, так как в них не будет атрибута. То есть, если вы хотите узнать, какова цель (а не цель времени выполнения) скомпилированной сборки, которую вы дали, и эта сборка предшествует v4, это не сработает. - person T.J. Crowder; 02.02.2015

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

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

person mmx    schedule 22.02.2010
comment
Этот ответ проблематичен при загрузке старых сборок смешанного режима без флага конфигурации useLegacyV2RuntimeActivationPolicy. - person gigaplex; 09.10.2013
comment
Спасибо. Если бы у меня была старая .NET dll, CCW, я переписываю / заменяю 64-битной версией .NET 4, и, хоть убей, я не мог точно вспомнить, был ли оригинал все еще .NET v1.1 или был затронут предыдущий проект миграции и обновлен до v2.x. Это отлично помогло и подтвердило, что наша версия продукта по-прежнему v1.1.4322. - person Developer63; 20.02.2015

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

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

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

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

person Robin Minto    schedule 10.01.2011

Вот лайнер PowerShell One, который отображает версию целевой платформы для сборок, ориентированных на v4 и выше.

 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

использовать:

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"
person Anders Forsgren    schedule 29.08.2018

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

ЗАГРУЗИТЕ вашу dll / exe / CLRHEADER

person Tinku    schedule 22.02.2010
comment
Я получаю кучу загадочных флагов, включая версию времени выполнения 2.05, но это сборка .NET 4.0. - person Roman Starkov; 30.11.2012

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

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

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

person mistika    schedule 04.05.2011

Как предложила @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);
person Andy    schedule 23.05.2014

Я использую ILSpy как замену Reflector. Если открыть сборку в ILSpy, можно увидеть, например:

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

person xr280xr    schedule 07.01.2019
comment
Работает хорошо. Установите вид C#, чтобы увидеть эту информацию. - person Contango; 18.11.2019

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

person xforfun    schedule 21.03.2016

Если вы хотите включить результат в сценарий, я рекомендую использовать текстовый вывод 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 не распознает «Длина строки версии».

person ferarias    schedule 21.09.2015

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

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

person yantaq    schedule 13.10.2015
comment
Это дает версию сборки, а не версию .Net, необходимую для ее запуска. - person rymdsmurf; 23.02.2017
comment
@rymdsmurf, мой ответ удовлетворяет потребность OP. хотя он не предоставляет версию .Net, но дает версию сборки, которая сообщает, какая версия .Net ему требуется, не так ли! Большая часть приведенного выше ответа демонстрирует получение версии сборки, поэтому стоит ли вам голосовать за них всех !? - person yantaq; 06.03.2017
comment
Ваша формулировка вместе с выделенным текстом на картинке предполагает, что ваш ответ объясняет, как получить версию сборки исходной сборки (ту, которая упоминается в вопросе OP). Но версия этой сборки не имеет ничего общего с версией зависимостей ее фреймворка. Если вы не это имели в виду, возможно, вам стоит сформулировать ответ по-другому, а может быть, заменить скриншот. - person rymdsmurf; 07.03.2017
comment
Я ценю ваш комментарий, но вы оставили меня более смущенным своим: версия сборки исходной сборки ?. это либо версия сборки (версия AKA dll), либо версия CLR (версия среды выполнения, которая требуется для сборки). кстати, я переформулировал свой ответ, надеюсь, теперь он более понятен. - person yantaq; 10.03.2017
comment
Оригинал - это просто я имею в виду сборку, которая заставила OP задать вопрос в первую очередь. В отличие от любой упомянутой сборки (CLR или нет). - person rymdsmurf; 13.03.2017
comment
[...] исполняемый файл для получения версии сборки, который сообщает вам версию CLR, что он требует [...] Но версия сборки не сообщает вам, какую версию CLR он использует ... Версия сборки произвольной сборки могло быть абсолютно что угодно! - person rymdsmurf; 13.03.2017
comment
В моем случае он сообщает вам версию CLR. иди, сделай домашнее задание assemblyinformation.codeplex.com/SourceControl/ - person yantaq; 13.03.2017
comment
msdn.microsoft.com / ru-ru / library / - person yantaq; 13.03.2017
comment
Я действительно пытался вам это объяснить, но, похоже, я не справляюсь. - person rymdsmurf; 15.03.2017