2010-08-11 2 views
92

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

+2

Возможный дубликат [Как узнать, какую версию .NET Framework необходимо выполнить для запуска?] (Http://stackoverflow.com/questions/325918/how-to-find-out-which -version-of-the-net-framework-an-executable-needs-to-run) – sirdank

ответ

46

Загрузить его в Reflector и посмотреть, на что это похоже?

, например:

enter image description here

+0

Моя идея тоже, но, зная рефлектор, она, вероятно, будет жаловаться и дать ей хороший значок без знака. – leppie

+0

@leppie Не должно быть проблем, даже если это .NET 1.1. Просто измените свой список сборки по умолчанию. – ParmesanCodice

+0

Спасибо за помощь. Отражатель спасения еще раз. – mpenrow

8

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

40

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

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

Что я ищу здесь? Означает ли это .NET 4.0? '// Раздел метаданных: 0x424a5342, версия: 1.1, дополнительно: 0, версия len: 12, versio n: v4.0.30319' – PeterX

+0

Да, для .NET 2 Я получаю следующее: // Раздел метаданных: 0x424a5342, версия : 1.1, дополнительно: 0, версия len: 12, версия: v2.0.50727 – Simon

13

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

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

из командной строки, начиная с версии 2.0, ildasm.exe покажет его, если вы дважды щелкните «МАНИФЕСТ» и ищите «версию метаданных». Determining an Image’s CLR Version

+0

Как получить ImageRuntimeVersion для CurrentAppDomain? – Kiquenet

54

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

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

enter image description here

+3

FYI, я переключился с DotPeek на JustDecompile из-за одной проблемы: если вы выберете «конкретная версия = ложь», DotPeek покажет пустую версию, а JustDecompile отобразит правильную версию. Это стоило переключиться на меня. – ashes999

+0

Отлично - сделал именно то, что я хотел, не установив пробную версию Reflector. – bernhardrusch

10

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

enter image description here

+0

Я думаю, что этот вопрос не спрашивает о том, когда DLL ссылается на Visual Studio, но на любую DL DL DL, которую вы найдете на своем ПК. – ashes999

+6

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

8

Просто

var tar = (TargetFrameworkAttribute)Assembly 
      .LoadFrom("yoursAssembly.dll") 
      .GetCustomAttributes(typeof(TargetFrameworkAttribute)).First(); 
+1

Я не знаю, почему это было приостановлено, но я могу запустить фрагмент (требуется ссылка на System.Runtime.Versioning) и успешно получить результат (это от LINQPad): TypeId typeof (TargetFrameworkAttribute) FrameworkName. NETFramework, Version = v4.0 FrameworkDisplayName .NET Framework 4 – dotnetguy

+0

Этот код не извлекает полную версию фреймворка. «4.0» хорошо знать, но «v4.0.30319» было бы более полезно, если бы вы, скажем, пытались добраться до RegAsm.exe. Более полную информацию о версии можно найти в: string tar = Assembly.LoadFrom (@ "myAssembly.dll"). ImageRuntimeVersion; – Martin

11

Использование ILSpy

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

+0

Спасибо за подсказку, очень полезно! –

70

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

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

Я адаптированное это PowerShell из Ben Griswold's answer.

Если вы хотите знать, целевой рамочное версии, указанной в 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

+1

Этот ответ наиболее полезен. Все ОС Windows после 2003 года поддерживают Powershell. Оболочка дает немедленную обратную связь, не требуя дополнительной поддержки приложений, как и многие другие ответы. Отлично подходит для «одной» проверки DLL. ты мужчина @swoogan. –

+1

Я сделал это для DLL, который я построил с помощью TargetFrameworkVersion v3.5, и он вернул v2.0.50727. Что мне не хватает? – BHSPitMonkey

+3

@BHSPitMonkey существует только 4 версии исполнения: 1.0, 1.1, 2.0 и 4.0. .NET 3.0 и 3.5 скомпилируются в CLR версии 2.0. https://msdn.microsoft.com/en-us/library/bb822049(v=vs.110).aspx – Swoogan