Myślę, że najbliższym możliwym niezawodnym rozwiązaniem jest określenie, która wersja CLR jest wymagana. Można to zrobić, używając ILDASM i patrząc na węzeł „MANIFEST” lub reflektor i patrząc na widok demontażu węzła „Application.exe” jako IL. W obu przypadkach jest komentarz wskazujący na wersję CLR. W ILDASM komentarz to „// Wersja metadanych”, a w Reflektorze komentarz to „Docelowa wersja środowiska wykonawczego”.
Oto przykłady aplikacji .NET WinForms o nazwie WindowsFormsApplication1.exe:
Znajdując odwołanie z metadanymi najwyższej wersji, można określić, z której wersji Framework pochodzi, z którego pochodzi, co wskazywałoby, że do uruchomienia aplikacji potrzebna jest ta sama wersja Framework zainstalowana. Biorąc to pod uwagę, nie traktowałbym tego jako w 100% niezawodnego, ale nie sądzę, że wkrótce się to zmieni.
Niestety Microsoft wprowadza przełomową zmianę dla powyższej techniki. Zestawy .NET 4.5 nie mogą działać na surowym środowisku .NET 4, a aby poinformować zestaw .NET 4.5, należy również odczytać System.Runtime.Versioning.TargetFrameworkAttribute. lextm.com/2013/02/how-to-tell-net-45-only-assemblies.html
powtórz ostatnie wyszukiwanie za pomocą, F3aż .NET Framework,version=vX.Ypojawi się
jeśli nic nie zostanie znalezione (wersje poniżej 3.0), wyszukaj v2.... wciąż 100 razy łatwiejsze niż instalowanie gigabajtów narzędzi do analizowania sieci i śmieci.
Każdy inny edytor / przeglądarka może otworzyć pliki binarne też, jak Notepad ++ lub wielkim text / hex widza TotalCommander za Lister .
Możesz teraz użyć ILSpy do zbadania struktury docelowej zestawu. Po załadowaniu zestawu kliknij katalog główny węzła zestawu i możesz znaleźć informacje w deklaracji TargetFramework:
Należy pamiętać, że TargetFrameworkAttribute został dodany tylko w .NET 4.0, więc nie będzie obecny w zestawach skompilowanych dla .NET 3.5 lub wcześniejszych.
Wai Ha Lee
ILSpy pokazuje „Runtime: vXXX” w komentarzach po kliknięciu załadowanego węzła głównego zespołu. Udało mi się zobaczyć projekt ramowy v1.1.4322.
ryancdotnet
15
Z kodu, którego możesz użyć, Assembly.ImageRuntimeVersionale patrząc na plik prawdopodobnie najlepiej byłoby użyć reflektora i sprawdzić, do której wersji mscorlibsię odwołujesz.
Edycja: jeszcze lepiej byłoby użyć ildasm , otworzyć zestaw, a następnie wyświetlić manifest zestawu. Pierwszy wiersz manifestu zawiera dokładną wersję środowiska CLR, dla którego został zbudowany zestaw.
To jest źle. OP zapytał o wersję .NET Framework, a nie o wersję środowiska wykonawczego CLR. Ta odpowiedź dotyczy tego drugiego. Na przykład korzystam z Framework 4.7.2531.0, który używa CLR Runtime w wersji 4.0.30139. ImageRuntimeVersion zwraca wersję CLR, a nie wersję Framework.
Tom Baxter
11
Możesz użyć narzędzia o nazwie CorFlags.exe. Jest już od .NET 2.0 i wiem na pewno, że jest zawarty w Windows SDK 7.0. Domyślnie (w systemie Windows XP Pro) jest instalowany w C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exe. Podaj mu ścieżkę do pliku zarządzanego modułu (bez żadnych innych flag wiersza polecenia), aby wyświetlić jego informacje nagłówkowe, w tym wersję.
Należy pamiętać, że to narzędzie jest przeznaczone do modyfikowania nagłówka PE32 modułu, więc nie używaj żadnej z flag, dopóki dokładnie nie przeczytasz dokumentacji .
Możesz też po prostu dowiedzieć się, jakie odniesienie do System.Core ma. Dzięki temu dowiesz się, z jakiej wersji .NET Framework korzysta ta aplikacja. W przypadku wersji 2.0 wersja System.Core to 2.0.xxx.xxx. W przypadku wersji 3.5 będzie to 3.5.xxx.xxx itd.
Odpowiedzi:
Myślę, że najbliższym możliwym niezawodnym rozwiązaniem jest określenie, która wersja CLR jest wymagana. Można to zrobić, używając ILDASM i patrząc na węzeł „MANIFEST” lub reflektor i patrząc na widok demontażu węzła „Application.exe” jako IL. W obu przypadkach jest komentarz wskazujący na wersję CLR. W ILDASM komentarz to „// Wersja metadanych”, a w Reflektorze komentarz to „Docelowa wersja środowiska wykonawczego”.
Oto przykłady aplikacji .NET WinForms o nazwie WindowsFormsApplication1.exe:
ILDASM:
Reflektor:
Możesz również przejrzeć listę zestawów, do których istnieją odwołania, i poszukać odwołania o najwyższym numerze wersji.
Ponownie, używając ILDASM patrząc na dane węzła „MANIFEST”:
I używając Reflectora, patrząc na dissambly (nadal jako IL) dla każdego wymienionego odniesienia:
Znajdując odwołanie z metadanymi najwyższej wersji, można określić, z której wersji Framework pochodzi, z którego pochodzi, co wskazywałoby, że do uruchomienia aplikacji potrzebna jest ta sama wersja Framework zainstalowana. Biorąc to pod uwagę, nie traktowałbym tego jako w 100% niezawodnego, ale nie sądzę, że wkrótce się to zmieni.
źródło
Używając Notatnika , sprzed trzech dekad, rozmiaru 200 KB, preinstalowanego narzędzia:
notepad appname.exe
,F3
aż.NET Framework,version=vX.Y
pojawi sięv2.
... wciąż 100 razy łatwiejsze niż instalowanie gigabajtów narzędzi do analizowania sieci i śmieci.Każdy inny edytor / przeglądarka może otworzyć pliki binarne też, jak Notepad ++ lub wielkim text / hex widza TotalCommander za Lister .
źródło
Bardziej uproszczonym podejściem byłoby użycie dotPeek i zobaczenie, co pojawia się w drzewie.
Zobacz panel właściwości:
źródło
Możesz teraz użyć ILSpy do zbadania struktury docelowej zestawu. Po załadowaniu zestawu kliknij katalog główny węzła zestawu i możesz znaleźć informacje w deklaracji TargetFramework:
źródło
Z kodu, którego możesz użyć,
Assembly.ImageRuntimeVersion
ale patrząc na plik prawdopodobnie najlepiej byłoby użyć reflektora i sprawdzić, do której wersjimscorlib
się odwołujesz.Edycja: jeszcze lepiej byłoby użyć ildasm , otworzyć zestaw, a następnie wyświetlić manifest zestawu. Pierwszy wiersz manifestu zawiera dokładną wersję środowiska CLR, dla którego został zbudowany zestaw.
źródło
Możesz użyć narzędzia o nazwie CorFlags.exe. Jest już od .NET 2.0 i wiem na pewno, że jest zawarty w Windows SDK 7.0. Domyślnie (w systemie Windows XP Pro) jest instalowany w C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exe. Podaj mu ścieżkę do pliku zarządzanego modułu (bez żadnych innych flag wiersza polecenia), aby wyświetlić jego informacje nagłówkowe, w tym wersję.
Należy pamiętać, że to narzędzie jest przeznaczone do modyfikowania nagłówka PE32 modułu, więc nie używaj żadnej z flag, dopóki dokładnie nie przeczytasz dokumentacji .
źródło
Z wiersza poleceń:
find "Framework" MyApp.exe
źródło
Możesz też po prostu dowiedzieć się, jakie odniesienie do System.Core ma. Dzięki temu dowiesz się, z jakiej wersji .NET Framework korzysta ta aplikacja. W przypadku wersji 2.0 wersja System.Core to 2.0.xxx.xxx. W przypadku wersji 3.5 będzie to 3.5.xxx.xxx itd.
źródło
Wersję .NET pliku można uzyskać w systemie Windows za pomocą programu PowerShell. Poniższy skrypt;
daje następujący wynik;
Zauważ, że wynik wyodrębnił wersję .NET dla plików exe w tym folderze, ale zrobi to również dla dll.
źródło
W systemie Linux / OSX / unix możesz użyć:
źródło