Określ wersję .NET Framework dla dll

137

Mam starą bibliotekę dll, która została skompilowana w ramach platformy .NET i wdrożona. Nie jestem pewien, dla której wersji platformy .NET został skompilowany. Zastanawiam się, jak mogę określić, z którą wersją platformy .NET została skompilowana ta biblioteka dll? Nie mogę ufać kodowi źródłowemu, ponieważ uważam, że został uaktualniony do programu Visual Studio 2008 i zmieniony na .NET Framework w wersji 3.5.

mpenrow
źródło

Odpowiedzi:

49

Załaduj go do Reflectora i zobacz, do czego się odnosi?

na przykład:

wprowadź opis obrazu tutaj

ParmezanCodice
źródło
1
Mój pomysł też, ale znając reflektor, prawdopodobnie będzie narzekał i da mu ładną nieopisową ikonę błędu.
leppie
@leppie Nie powinno być problemu, nawet jeśli jest to .NET 1.1. Po prostu zmień domyślną listę montażu.
ParmesanCodice
Twoja odpowiedź jest bardzo pomocna, ale radzę nie polegać na niej ślepo - wczoraj spędziłem zbyt dużo czasu nad własnym projektem, który był przeznaczony dla .Net 4.0, zgłoszony przez Reflector do korzystania z .Net 4.0.3 i wymagający użycia .Net 4.5 by Windows :-) Nie znam żadnej metody weryfikacji tego na projekcie poza źródłami - zobacz tutaj: stackoverflow.com/questions/13214503/…
greenoldman
3
Możesz także skorzystać z darmowej, otwartej alternatywy ILSpy, jak zauważyła Kat Lim Ruiz.
Marcus Mangelsdorf
Ta odpowiedź zadziałała dla mnie: stackoverflow.com/a/3461027/2961177 .
ckkkitty
128

W PowerShell możesz użyć następujących poleceń, aby uzyskać docelowe środowisko uruchomieniowe:

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

Dostosowałem to do PowerShell z odpowiedzi Bena Griswolda .

Jeśli chcesz poznać docelową wersję platformy określoną w programie Visual Studio, użyj:

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

Powinieneś dostać coś takiego

.NETFramework, wersja = v4.5.2

Swoogan
źródło
4
Ta odpowiedź jest najbardziej pomocna. Wszystkie systemy operacyjne Windows po 2003 roku obsługują Powershell. Powłoka dająca natychmiastową informację zwrotną, nie wymagająca żadnej dodatkowej obsługi aplikacji, jak sugeruje wiele innych odpowiedzi. Idealne do jednorazowego sprawdzenia biblioteki dll. jesteś człowiekiem @swoogan.
Nathan McCoy
1
Zrobiłem to dla biblioteki DLL, którą zbudowałem za pomocą TargetFrameworkVersion w wersji 3.5, i zwróciła wersję 2.0.50727. czego mi brakuje?
BHSPitMonkey
4
@BHSPitMonkey tak naprawdę były tylko 4 wersje runtime: 1.0, 1.1, 2.0 i 4.0. .NET 3.0 i 3.5 kompilują się do środowiska CLR w wersji 2.0. msdn.microsoft.com/en-us/library/bb822049(v=vs.110).aspx
Swoogan,
1
Ten skrypt zapewnia tylko RuntimeVersion, pytanie dotyczy TargetFrameworkversion. Skutecznie dla wszystkich zestawów skompilowanych w porównaniu z 2.0,3.0,3.5 ten skrypt pokazuje wersję Runtime jako 2.0.0.0
Kiran Vedula
3
Dla mnie ReflectionOnlyLoadFrom zwraca ImageRuntimeVersion, ale zero CustomAttributes. Użycie LoadFrom zamiast ReflectionOnlyLoadFrom daje oczekiwany wynik. Jakiegokolwiek powodu? PSVersion 5.1.16299.251 CLRVersion 4.0.30319.42000
Bernard Vander Beken
69

dotPeek to świetne (bezpłatne) narzędzie do wyświetlania tych informacji.

Jeśli masz kilka problemów z uzyskaniem Reflectora, jest to dobra alternatywa.

wprowadź opis obrazu tutaj

wal
źródło
4
FYI, przełączyłem się z DotPeek na JustDecompile z powodu jednego problemu: jeśli wybierzesz opcję „specific version = false”, DotPeek wyświetli pustą wersję, a JustDecompile pokaże poprawną wersję. Sprawiło, że warto było dla mnie zmienić.
popioły 999
Świetnie - zrobiłem dokładnie to, co chciałem, bez instalowania wersji próbnej dla Reflectora.
bernhardrusch
49

Możesz użyć ILDASM ...

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

i sprawdź, czy w wynikach znajduje się „Sekcja metadanych”. To byłoby coś takiego:

Sekcja metadanych: 0x424a5342, wersja: 1.1, extra: 0, wersja len: 12, wersja: v4.0.30319

Znacznik „wersja” informuje o wersji .NET Framework. W powyższym przykładzie jest to 4.0.30319

Josh Stodola
źródło
3
Czego tu szukam? Czy to oznacza .NET 4.0? // Metadata section: 0x424a5342, version: 1.1, extra: 0, version len: 12, versio n: v4.0.30319
PeterX
Tak, dla .NET 2 otrzymuję: // Sekcja metadanych: 0x424a5342, wersja: 1.1, extra: 0, wersja len: 12, wersja: v2.0.50727
Simon
17

Masz kilka opcji: Aby uzyskać to programowo z kodu zarządzanego, użyj Assembly.ImageRuntimeVersion:

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

W wierszu poleceń, począwszy od wersji 2.0, plik ildasm.exe pokaże go po dwukrotnym kliknięciu „MANIFESTU” i wyszukaniu „Wersja metadanych”. Określanie wersji CLR obrazu

Ben Griswold
źródło
Jak uzyskać ImageRuntimeVersion dla CurrentAppDomain?
Kiquenet,
17

Użyj ILSpy http://ilspy.net/

open source, darmowy, zdecydowanie opcja, ponieważ teraz reflektor jest płatny.

Kat Lim Ruiz
źródło
15

Po prostu

var tar = (TargetFrameworkAttribute)Assembly
          .LoadFrom("yoursAssembly.dll")
          .GetCustomAttributes(typeof(TargetFrameworkAttribute)).First();
stenly
źródło
1
Nie wiem, dlaczego zostało to odrzucone, ale mogę uruchomić snippet (potrzebne jest odniesienie do System.Runtime.Versioning) i pomyślnie uzyskać dane wyjściowe (to jest z LINQPad): TypeId typeof (TargetFrameworkAttribute) FrameworkName .NETFramework, Version = v4.0 FrameworkDisplayName .NET Framework 4
Sudhanshu Mishra
Ten kod nie pobiera pełnej wersji platformy. Warto wiedzieć „4.0”, ale wersja „v4.0.30319” byłaby bardziej przydatna, gdybyśmy np. Próbowali dostać się do RegAsm.exe. Pełniejsze informacje o wersji można znaleźć w: string tar = Assembly.LoadFrom (@ "myAssembly.dll"). ImageRuntimeVersion;
Martin
Wydaje się, że jest to właściwe podejście, czy są jakieś okoliczności, w których zespół może nie mieć zastosowanego tego atrybutu? Przetestowałem go z zestawem .NET Core i poprawnie raportuje netcore i numer wersji.
Adam Naylor
To nie działa dla mnie. GetCustomAttributesNie posiada TargetFrameworkAttribute. Jednak ImageRuntimeVersion działa dobrze, pobiera odpowiedni CLR, dla którego został zbudowany plik binarny. Potrzebuję docelowej wersji platformy, dla której została zbudowana.
Shameel Mohamed,
13

Jeszcze inna opcja za pośrednictwem Visual Studio, dodaj odwołanie do biblioteki DLL do dowolnego projektu, a następnie kliknij prawym przyciskiem myszy nowe odwołanie i kliknij opcję Właściwości, aby zobaczyć, czego szukasz w wersji Runtime:

wprowadź opis obrazu tutaj

lingo_journey
źródło
Myślę, że to pytanie nie dotyczy tego, kiedy w programie Visual Studio występują odwołania do biblioteki DLL, ale do każdej starej biblioteki DLL .NET, którą można znaleźć na komputerze.
prochy 999
7
Ta odpowiedź wskazuje, że możesz dodać odwołanie do dowolnej starej biblioteki DLL .NET, którą znajdziesz na komputerze, a jedną z właściwości elementu w obszarze Odnośniki odpowiadającej tej bibliotece DLL jest „Wersja środowiska wykonawczego”.
ALEXintlsos
8

Zdekompiluj go za pomocą ILDASM i spójrz na wersję mscorlib, do której się odwołujemy (powinna znajdować się prawie na górze).

leppie
źródło
4

Najprostszy sposób: po prostu otwórz plik .dll w dowolnym edytorze tekstu. Spójrz na jedną z ostatnich linii: wprowadź opis obrazu tutaj

cedenbal
źródło
Najlepsza opcja spośród wszystkich
Sisir
2
Jednak to nie działa w przypadku bibliotek dll zbudowanych przed .Net 3.0
Sisir
2

Szybko napisałem tę aplikację konsolową C #, aby to zrobić:

https://github.com/stuartjsmith/binarydetailer

Po prostu przekaż katalog jako parametr, a on zrobi wszystko, co w jego mocy, aby poinformować cię o strukturze sieciowej dla każdej biblioteki dll i exe w tym miejscu

stuartjsmith
źródło
Daje dobre szczegółowe informacje; jest to aplikacja wiersza poleceń; musisz przekazać mu nazwę katalogu w linii poleceń.
philu
2

Detect It Easy ”, znany również jako DiE, to program do określania typów plików. Działa z plikami .dll lub innymi plikami (.exe). Całkowicie darmowy do użytku komercyjnego i niekomercyjnego.

wprowadź opis obrazu tutaj

20AMax
źródło
0

Jeśli masz DotPeek from JetBrains, możesz to zobaczyć w Assembly Explorer.

Czy widzisz ten zrzut ekranu?  nie jestem:(

Sam Sch
źródło
0

Rozwijając odpowiedzi tutaj, może to wybuchnąć, jeśli istnieje zależny montaż. Jeśli masz szczęście i wiesz, gdzie jest osoba zależna (lub nawet szczęśliwsza, jest w GAC), może to pomóc ...

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);
}

Źródła: https://weblog.west-wind.com/posts/2006/Dec/22/Reflection-on-Problem-Assemblies

Facet z CAD
źródło