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.


Odpowiedzi:


49

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

na przykład:

wprowadź opis obrazu tutaj


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


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


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


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


Jak uzyskać ImageRuntimeVersion dla CurrentAppDomain?
Kiquenet,


15

Po prostu

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

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


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).


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


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


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


0

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

Czy widzisz ten zrzut ekranu?  nie jestem:(


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.