Визначте .NET Framework версію для dll


137

У мене є старий dll, який був складений на основі .NET і розгорнутий. Я не впевнений, з якою версією .NET фреймворку він був складений. Мені цікаво, як я можу визначити, проти якої версії .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, версія = v4.5.2


4
Ця відповідь є найбільш корисною. Усі ОС Windows після 2003 року підтримують Powershell. Оболонка, що дає негайний зворотний зв'язок, не вимагає додаткової підтримки додатків, як підказує багато інших відповідей. Відмінно підходить для "разового" перевірки DLL. ти людина @swoogan.
Натан Маккой

1
Я зробив це для DLL, який я створив за допомогою TargetFrameworkVersion v3.5, і він повернув v2.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, цей сценарій демонструє версію виконання як 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
FYI, я перейшов з DotPeek на JustDecompile через одну проблему: якщо ви вибрали "конкретна версія = false", 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
Simon

17

У вас є кілька варіантів: Щоб отримати це програмно, з керованого коду, використовуйте Assembly.ImageRuntimeVersion:

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

З командного рядка, починаючи з v2.0, ildasm.exe покаже його, якщо двічі клацнути на "MANIFEST" і шукати "Версію метаданих". Визначення версії CLR зображення


Як отримати ImageRuntimeVersion для CurrentAppDomain?
Кікенет

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
Sudhanshu Mishra

Цей код не отримує повну версію фреймворку. "4.0" добре знати, але "v4.0.30319" було б корисніше, якби ви, скажімо, намагалися потрапити на RegAsm.exe. Більш повну інформацію про версію можна знайти в: string tar = Assembly.LoadFrom (@ "myAssembly.dll"). ImageRuntimeVersion;
Мартін

Це здається правильним підходом, чи є обставини, коли збірка може не застосовувати цей атрибут? Я перевірив його за допомогою збірки .NET Core, і він правильно повідомляє про netcore та номер версії.
Адам Нейлор

Це не працює для мене. GetCustomAttributesНе має TargetFrameworkAttribute. Але ImageRuntimeVersion прекрасно працює, але він отримує потрібний CLR, для якого був створений двійковий файл. Мені потрібна цільова рамкова версія, для якої вона була побудована.
Shameel Mohamed

13

Ще одна опція через Visual Studio, додайте посилання на DLL до будь-якого проекту, потім клацніть правою кнопкою миші нову посилання та натисніть Властивості, ви зможете побачити, що шукаєте у версії Runtime:

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


Я думаю, що це питання не задає питання про те, коли на DLL посилається у Visual Studio, але будь-яку o. '.NET DLL, яку ви знайдете, лежачи на вашому ПК.
ashes999

7
Ця відповідь вказує на те, що ви можете додати посилання на будь-який ol '.NET DLL, який ви знаходитесь на вашому ПК, а одним із властивостей елемента в Посиланнях, що відповідають цій DLL, є "Версія виконання".
ALEXintlsos

8

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


4

Найпростіший спосіб: просто відкрийте .dll в будь-якому текстовому редакторі. Подивіться на один з останніх рядків: введіть тут опис зображення


Найкращий варіант серед усіх
Сисір

2
Однак це не працює для dll, побудованих раніше. Net 3.0
Sisir

2

Я швидко написав цей консольний додаток C #, щоб зробити це:

https://github.com/stuartjsmith/binarydetailer

Просто передайте каталог як параметр, і він зробить усе можливе, щоб повідомити вам, чистий фреймворк для кожного dll та exe там


Дає хорошу детальну інформацію; це додаток командного рядка; ви повинні передати йому ім'я каталогу в командному рядку.
філу

2

" Виявити це легко " також відомий як 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.