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


137

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


Ответы:


49

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

например:

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


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


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


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-версии:

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


Я думаю, что этот вопрос не о том, когда в Visual Studio есть ссылка на DLL, а о том, что на вашем компьютере лежит какая-либо старая .NET DLL.
ashes999

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

8

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


4

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


Лучший вариант среди всех
Сисир

2
Однако это не работает для dll, созданных до .Net 3.0
Сисир

2

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

https://github.com/stuartjsmith/binarydetailer

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


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

2

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

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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.