Определить версию .NET Framework для dll

137

У меня есть старая dll, которая была скомпилирована с платформой .NET и развернута. Я не уверен, с какой версией .NET Framework он был скомпилирован. Мне интересно, как я могу определить, с какой версией .NET Framework эта DLL была скомпилирована? Я не могу доверять исходному коду, поскольку считаю, что он был обновлен до Visual Studio 2008 и изменен на .NET Framework версии 3.5.

mpenrow
источник

Ответы:

49

Загрузите его в Reflector и посмотрите, на что он ссылается?

например:

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

ParmesanCodice
источник
1
Моя идея тоже, но, зная отражатель, он, вероятно, будет жаловаться, и даст ему хороший неописуемый значок ошибки.
Леппи
@leppie Не должно быть проблемой, даже если это .NET 1.1. Просто измените свой список сборки по умолчанию.
ParmesanCodice
Ваш ответ очень полезен, но я советую не полагаться на него вслепую - вчера я потратил слишком много времени на свой собственный проект, нацеленный на .Net 4.0, по сообщениям Reflector на использование .Net 4.0.3 и необходимый для использования .Net 4.5 от Windows :-) Я не знаю какого-либо метода проверки этого в проекте, кроме как с источниками - см. Здесь: stackoverflow.com/questions/13214503/…
greenoldman
3
Вы также можете использовать бесплатную альтернативу ILSpy с открытым исходным кодом, как отмечает Kat Lim Ruiz.
Маркус Мангельсдорф
Этот ответ работал для меня: stackoverflow.com/a/3461027/2961177 .
ckkkitty
128

В PowerShell вы можете использовать следующее для получения целевой среды выполнения:

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).ImageRuntimeVersion

Я адаптировал это к PowerShell из ответа Бена Грисволда .

Если вы хотите узнать версию целевой платформы, указанную в Visual Studio, используйте:

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).CustomAttributes |
Where-Object {$_.AttributeType.Name -eq "TargetFrameworkAttribute" } | 
Select-Object -ExpandProperty ConstructorArguments | 
Select-Object -ExpandProperty value

Вы должны получить что-то вроде

.NETFramework, Version = v4.5.2

Swoogan
источник
4
Этот ответ является наиболее полезным. Все ОС Windows после 2003 года поддерживают Powershell. Оболочка, дающая немедленную обратную связь, не требующую дополнительной поддержки приложения, как предлагают многие другие ответы. Отлично подходит для "одноразовой" проверки DLL. ты человек @ swoogan.
Натан Маккой
1
Я сделал это для библиотеки DLL, которую я собрал с TargetFrameworkVersion версии 3.5, и он вернул версию 2.0.50727. Чего мне не хватает?
BHSPitMonkey
4
@BHSPitMonkey действительно было только 4 версии времени выполнения: 1.0, 1.1, 2.0 и 4.0. .NET 3.0 и 3.5 компилируются в CLR версии 2.0. msdn.microsoft.com/en-us/library/bb822049(v=vs.110).aspx
Swoogan
1
Этот скрипт предоставляет только RuntimeVersion, вопрос о TargetFrameworkversion. Эффективно для всех сборок, скомпилированных против 2.0,3.0,3.5, этот сценарий показывает версию Runtime как 2.0.0.0
Kiran Vedula
3
Для меня ReflectionOnlyLoadFrom возвращает ImageRuntimeVersion, но ноль CustomAttributes. Использование LoadFrom вместо ReflectionOnlyLoadFrom дает ожидаемый результат. Любая причина? PSVersion 5.1.16299.251 CLRVersion 4.0.30319.42000
Бернард Вандер Бекен,
69

dotPeek - отличный (бесплатный) инструмент для отображения этой информации.

Если у вас возникли некоторые проблемы с использованием Reflector, то это хорошая альтернатива.

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

вали
источник
4
К вашему сведению, я перешел с DotPeek на JustDecompile из-за одной проблемы: если вы выберите «конкретная версия = ложь», DotPeek показал пустую версию, а JustDecompile показывает правильную версию. Сделано это стоит переключения для меня.
ashes999
Отлично - сделал именно то, что хотел, без установки пробной версии для Reflector.
Bernhardrusch
49

Вы можете использовать ILDASM ...

ildasm.exe C:\foo.dll /metadata[=MDHEADER] /text /noil

и проверьте «раздел метаданных» в выходных данных. Это было бы что-то вроде этого:

Раздел метаданных: 0x424a5342, версия: 1.1, дополнительная: 0, версия len: 12, версия: v4.0.30319

Тег 'version' сообщит вам версию .NET Framework. В приведенном выше примере это 4.0.30319

Джош Стодола
источник
3
Что я здесь ищу? Это значит .NET 4.0? // Metadata section: 0x424a5342, version: 1.1, extra: 0, version len: 12, versio n: v4.0.30319
PeterX
Да, для .NET 2 я получаю следующее: // Раздел метаданных: 0x424a5342, версия: 1.1, дополнительно: 0, версия len: 12, версия: v2.0.50727
Симон
17

У вас есть несколько вариантов: чтобы получить его программно, из управляемого кода, используйте Assembly.ImageRuntimeVersion:

Dim a As Assembly = Reflection.Assembly.ReflectionOnlyLoadFrom("C:\path\assembly.dll")
Dim s As String = a.ImageRuntimeVersion

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

Бен Грисволд
источник
Как получить ImageRuntimeVersion для CurrentAppDomain?
Kiquenet
17

Используйте ILSpy http://ilspy.net/

с открытым исходным кодом, бесплатно, безусловно, вариант, так как теперь рефлектор оплачивается.

Кэт Лим Руис
источник
15

Просто просто

var tar = (TargetFrameworkAttribute)Assembly
          .LoadFrom("yoursAssembly.dll")
          .GetCustomAttributes(typeof(TargetFrameworkAttribute)).First();
Стенли
источник
1
Я не знаю, почему это было отклонено, но я могу запустить сниппет (необходима ссылка на System.Runtime.Versioning) и успешно получить вывод (это из LINQPad): TypeId typeof (TargetFrameworkAttribute) FrameworkName .NETFramework, Версия = v4.0 FrameworkDisplayName .NET Framework 4
Судханшу Мишра
Этот код не получает полную версию фреймворка. «4.0» полезно знать, но «v4.0.30319» было бы более полезно, если бы вы, например, пытались добраться до RegAsm.exe. Более полную информацию о версии можно найти в: string tar = Assembly.LoadFrom (@ "myAssembly.dll"). ImageRuntimeVersion;
Мартин
Это кажется правильным подходом, есть ли обстоятельства, когда сборка может не применять этот атрибут? Я протестировал его с сборкой .NET Core, и он правильно сообщает netcore и номер версии.
Адам Нейлор
Это не работает для меня. GetCustomAttributesНе имеет TargetFrameworkAttribute. Но ImageRuntimeVersion работает отлично, он возвращает правильный CLR, для которого был создан двоичный файл. Мне нужна целевая версия фреймворка, для которой он был построен.
Шамель Мохамед
13

Еще один вариант через Visual Studio: добавить ссылку на DLL в любой проект, затем, щелкнув правой кнопкой мыши новую ссылку и выбрав Свойства, вы увидите то, что вы ищете в Runtime-версии:

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

lingo_journey
источник
Я думаю, что этот вопрос не о том, когда в Visual Studio есть ссылка на DLL, а о том, что на вашем компьютере лежит какая-либо старая .NET DLL.
ashes999
7
Этот ответ указывает на то, что вы можете добавить ссылку на любую старую DLL-библиотеку, которую вы находите на своем ПК, и одним из свойств элемента в разделе «Ссылки», соответствующей этой библиотеке DLL, является «Версия времени выполнения».
ALEXintlsos
8

Декомпилируйте его с помощью ILDASM и посмотрите на версию mscorlib, на которую ссылается (должна быть почти в самом верху).

leppie
источник
4

Самый простой способ: просто открыть .dll в любом текстовом редакторе. Посмотрите на одну из последних строк: введите описание изображения здесь

cedenbal
источник
Лучший вариант среди всех
Сисир
2
Однако это не работает для dll, созданных до .Net 3.0
Сисир
2

Я быстро написал это консольное приложение C #, чтобы сделать это:

https://github.com/stuartjsmith/binarydetailer

Просто передайте каталог в качестве параметра, и он сделает все возможное, чтобы рассказать вам о сетевом фреймворке для каждой библиотеки DLL и исполняемого файла.

stuartjsmith
источник
Дает хорошую подробную информацию; это приложение командной строки; Вы должны передать ему имя каталога в командной строке.
Филу
2

« Detect It Easy », также известная как DiE, - это программа для определения типов файлов. Работает с файлами .dll или другими (.exe) файлами. Абсолютно бесплатно для коммерческого и некоммерческого использования.

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

20AMax
источник
0

Если у вас есть DotPeekиз JetBrains, вы можете увидеть его в Assembly Explorer.

Можете ли вы увидеть этот скриншот?  я не:(

Сэм Ш
источник
0

Расширяя ответы здесь, это может взорваться, если есть зависимая сборка. Если вам повезло, и вы знаете, где находится иждивенец (или даже счастливчик, он в GAC), тогда это может помочь ...

using System.Reflection;
using System.Runtime.Versioning;
// ...
{
    AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
    var asm = System.Reflection.Assembly.LoadFrom(@"C:\Codez\My.dll");
    var targetFrameAttribute = asm.GetCustomAttributes(true).OfType<TargetFrameworkAttribute>().FirstOrDefault();
    targetFrameAttribute.Dump();
}

Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
    var name = args.Name;

    if (name.StartsWith("Depends"))
        return System.Reflection.Assembly.ReflectionOnlyLoadFrom(@"C:\Codez\Depends.dll");

    return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
}

Ссылка: https://weblog.west-wind.com/posts/2006/Dec/22/Reflection-on-Problem-Assemblies

CAD CAD
источник