Определить базовую (CLR) версию сборки - PullRequest
49 голосов
/ 22 февраля 2010

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

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

Ответы [ 12 ]

53 голосов
/ 22 февраля 2010

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

34 голосов
/ 05 сентября 2013

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

Проблема со всеми упомянутыми методами заключается в том, что они вернут версию 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
33 голосов
/ 22 февраля 2010
class Program {
  static void Main(string[] args) { 
      System.Console.WriteLine(
             System.Reflection.Assembly.LoadFrom(args[0]).ImageRuntimeVersion);
  }
}

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

9 голосов
/ 10 января 2011

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

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

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

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

5 голосов
/ 22 февраля 2010

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

DUMPBIN ваш dll / exe / CLRHEADER

4 голосов
/ 04 мая 2011

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

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

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

2 голосов
/ 29 августа 2018

Здесь представлен вкладыш powershell one, который будет отображать версию Target Framework для сборок, ориентированных на 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"
2 голосов
/ 23 мая 2014

Как подсказывает @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);
1 голос
/ 21 марта 2016

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

0 голосов
/ 07 января 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...