Wybacz głupie pytanie - ale co w tym mówi ci, że to x86?
George Mauer,
53
Pole ProcessorArchitecture jest wyliczeniem; w powyższym przykładzie jest ustawiony na MSIL, co oznacza „Neutralny w odniesieniu do procesora i bitów na słowo”. Inne wartości to X86, IA64, Amd64. Aby uzyskać więcej informacji, zobacz msdn.microsoft.com/en-us/library/ ...
Brian Gillespie,
4
Spróbuj, [reflection.assemblyname]::GetAssemblyName("${pwd}\name.dll")ponieważ czasami bieżący katalog procesu nie jest taki sam jak bieżący dostawca (w którym zakładam, że biblioteka DLL jest dla Ciebie)
x0n
2
Kolejnym zastrzeżeniem, na które należy zwrócić uwagę, jest zapomnienie o „odblokowaniu” biblioteki DLL, jeśli została ona pobrana z Internetu. Użyj pliku odblokowania lub kliknij prawym przyciskiem myszy / właściwości / odblokuj z Eksploratora. Będziesz musiał zrestartować powłokę, aby rozpoznała status odblokowania, jeśli już raz zawiodłeś w bieżącej sesji (obwiniaj za to Internet Explorera - tak, naprawdę.)
x0n
1
W kodzie ASP.NET MVC jest komentarz // DevDiv 216459: This code originally used Assembly.GetName(), but that requires FileIOPermission, which isn't granted in medium trust. However, Assembly.FullName *is* accessible in medium trust.Niestety nie ma możliwości odczytania architektury procesora bez użycia GetName instance method; przy użyciu AssemblyName constructorpole jest zawsze ustawione na None.
metadings
221
Możesz użyć narzędzia CorFlags CLI (na przykład C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0 \ Bin \ CorFlags.exe), aby określić status zestawu na podstawie jego danych wyjściowych i otwarcia zestawu jako binarny zasób, powinieneś być w stanie określić, gdzie musisz szukać, czy flaga 32BIT jest ustawiona na 1 ( x86 ) lub 0 ( dowolny procesor lub x64 , w zależności od PE):
Option| PE |32BIT----------|-------|---------
x86 | PE32 |1Any CPU | PE32 |0
x64 | PE32+|0
Co więcej, możesz użyć,Module.GetPEKind aby określić, czy zestaw jest PortableExecutableKindswartością PE32Plus(64-bit), Required32Bit(32-bit i WOW) lub ILOnly(dowolny procesor) wraz z innymi atrybutami.
Po obejrzeniu aktualizacji wydaje się, że użycie GetPEKind jest właściwym sposobem. Jako odpowiedź zaznaczyłem twój.
Judah Gabriel Himango,
9
GetPEKind kończy się niepowodzeniem w procesie 64-bitowym podczas sprawdzania zespołów 32-bitowych
jjxtra,
2
Musisz zadzwonić do GetPEKind z procesu 32-bitowego
Ludwo
2
Instaluję VS 2008, VS 2010, VS 2012 i VS 2013. Mam 8 plików CorFlags.exe w podfolderach w C: \ Program Files (x86) \ Microsoft SDKs \ Windows \. Którego powinienem użyć?
Kiquenet,
5
Jak wskazano w tej odpowiedzi , w .NET 4.5 zamiast flagi 32BIT występuje 32BITREQ i 32BITPREF. PE32 / 0/0 i PE32 / 0/1 są odpowiednio AnyCPU i AnyCPU 32-bitowe.
angularsen
141
Dla wyjaśnienia, CorFlags.exe jest częścią zestawu .NET Framework SDK . Mam narzędzia programistyczne na moim komputerze, a najprostszym sposobem na określenie, czy biblioteka DLL jest 32-bitowa, jest:
Otwórz wiersz polecenia programu Visual Studio (w systemie Windows: menu Start / Programy / Microsoft Visual Studio / Visual Studio Tools / Visual Studio 2008 Wiersz polecenia)
CD do katalogu zawierającego daną bibliotekę DLL
Uruchom corflags w następujący sposób:
corflags MyAssembly.dll
Otrzymasz coś takiego:
Microsoft(R).NET FrameworkCorFlagsConversionTool.Version3.5.21022.8Copyright(c)MicrosoftCorporation.All rights reserved.Version: v2.0.50727
CLR Header:2.5
PE : PE32
CorFlags:3
ILONLY :132BIT:1Signed:0
Zgodnie z komentarzami powyższe flagi należy rozumieć następująco:
Co powiesz na napisanie własnego? Rdzeń architektury PE nie został poważnie zmieniony od czasu jego implementacji w Windows 95. Oto przykład C #:
publicstaticushortGetPEArchitecture(string pFilePath){ushort architecture =0;try{using(System.IO.FileStream fStream =newSystem.IO.FileStream(pFilePath,System.IO.FileMode.Open,System.IO.FileAccess.Read)){using(System.IO.BinaryReader bReader =newSystem.IO.BinaryReader(fStream)){if(bReader.ReadUInt16()==23117)//check the MZ signature{
fStream.Seek(0x3A,System.IO.SeekOrigin.Current);//seek to e_lfanew.
fStream.Seek(bReader.ReadUInt32(),System.IO.SeekOrigin.Begin);//seek to the start of the NT header.if(bReader.ReadUInt32()==17744)//check the PE\0\0 signature.{
fStream.Seek(20,System.IO.SeekOrigin.Current);//seek past the file header,
architecture = bReader.ReadUInt16();//read the magic number of the optional header.}}}}}catch(Exception){/* TODO: Any exception handling you want to do, personally I just take 0 as a sign of failure */}//if architecture returns 0, there has been an error.return architecture;}}
Teraz obecne stałe to:
0x10B- PE32 format.0x20B- PE32+ format.
Ale dzięki tej metodzie pozwala ona na możliwości nowych stałych, wystarczy zweryfikować zwrot według własnego uznania.
Ciekawe, dziękuję za kod z wyjaśnieniem. Module.GetPEKind jest prawdopodobnie najłatwiejszą ścieżką. Ale to jest pomocne ze względu na naukę. Dzięki.
Judah Gabriel Himango,
3
Bardzo interesujące, ale gdy mam aplikację skompilowaną z dowolnym procesorem, wynikiem jest 0x10B. To źle, ponieważ moja aplikacja jest uruchomiona w systemie x64. Czy jest jakaś inna flaga do sprawdzenia?
Samuel
GetPEArchitecture działa dla zestawów skompilowanych przy użyciu .net 3.5, 4.0, 4.5 i 4.5.1? W każdym razie, jak sądzę, Module.GetPEKind kończy się niepowodzeniem w procesie 64-bitowym podczas sprawdzania zestawów 32-bitowych.
Kiquenet
9
Spróbuj użyć CorFlagsReader z tego projektu w CodePlex . Nie ma odniesień do innych zestawów i może być używany w takiej postaci, w jakiej jest.
To jest najdokładniejsza i najbardziej użyteczna odpowiedź.
Kirill Osenkov
Link nadal działa w chwili pisania tego tekstu, ale ponieważ CodePlex ma zostać zamknięty, dobrze byłoby wykonać odpowiednie działania, zanim będzie za późno.
Peter Mortensen
7
DotPeek od JetBrians zapewnia szybki i łatwy sposób zobaczenia msil (anycpu), x86, x64
Dzięki za to, jedna z naszych aplikacji musi być zbudowana jako x86, dodanie testu jednostkowego gwarantuje, że biblioteki kompilacji serwera kompilacji będą 32-bitowe i pozwoli uniknąć tych błędów :)
Mido
5
Poniżej znajduje się plik wsadowy, który będzie działał corflags.exedla wszystkich dllsoraz exesw bieżącym katalogu roboczym i wszystkich podkatalogach, analizował wyniki i wyświetlał architekturę docelową każdego z nich.
W zależności od wersji corflags.exe, która jest używana, gdy pozycje w wyjścia albo będzie zawierać 32BIT, lub32BITREQ (i 32BITPREF). Którykolwiek z tych dwóch elementów jest uwzględniony w danych wyjściowych, jest to krytyczny element zamówienia, który należy sprawdzić, aby odróżnić od Any CPUi x86. Jeśli używasz starszej wersji corflags.exe(wcześniejszej wersji Windows SDK 8.0A), tylko wynik 32BITbędzie obecny na wyjściu, jak wskazali inni w poprzednich odpowiedziach. W przeciwnym razie 32BITREQi 32BITPREFwymień go.
Zakłada się, że corflags.exejest w %PATH%. Najprostszym sposobem zapewnienia tego jest użycie Developer Command Prompt. Możesz też skopiować go z domyślnej lokalizacji .
Jeśli plik wsadowy poniżej jest uruchamiany z niezarządzanym dlllub exe, niepoprawnie wyświetli go jako x86, ponieważ rzeczywiste wyjście z Corflags.exebędzie komunikatem o błędzie podobnym do:
corflags: error CF008: Podany plik nie ma prawidłowego zarządzanego nagłówka
@echo off
echo.
echo Target architecture for all exes and dlls:
echo.
REM For each exe and dll inthis directory and all subdirectories...for%%a in(.exe,.dll)do forfiles /s /m *%%a /c "cmd /c echo @relpath"> testfiles.txt
for/f %%b in(testfiles.txt)do(
REM Dump corflags results to a text file
corflags /nologo %%b > corflagsdeets.txt
REM Parse the corflags results to look for key markers
findstr /C:"PE32+">nul .\corflagsdeets.txt &&(
REM `PE32+` indicates x64
echo %%~b = x64
)||(
REM pre-v8 Windows SDK listed only "32BIT" line item,
REM newer versions list "32BITREQ"and"32BITPREF" line items
findstr /C:"32BITREQ : 0">nul /C:"32BIT : 0".\corflagsdeets.txt &&(
REM `PE32`and NOT 32bit required indicates Any CPU
echo %%~b =Any CPU
)||(
REM `PE32`and32bit required indicates x86
echo %%~b = x86
))del corflagsdeets.txt
)del testfiles.txt
echo.
Jeszcze jednym sposobem byłoby użycie śmietnika z narzędzi Visual Studio na DLL i poszukiwanie odpowiedniego wyjścia
dumpbin.exe /HEADERS <your dll path>
FILE HEADER VALUE
14C machine (x86)4 number of sections
5885AC36 time date stamp MonJan2312:39:4220170 file pointer to symbol table
0 number of symbols
E0 size of optional header
2102 characteristics
Executable32 bit word machine
DLL
Uwaga: powyżej o / p jest dll dla 32-bitów
Jeszcze jedną przydatną opcją z dumpbin.exe jest / EXPORTS, pokaże ci funkcję ujawnioną przez dll
Sklonowałem bardzo przydatne narzędzie, które dodaje pozycję menu kontekstowego dla zestawów w Eksploratorze Windows, aby wyświetlić wszystkie dostępne informacje:
Innym sposobem sprawdzenia platformy docelowej zestawu .NET jest sprawdzenie zestawu za pomocą .NET Reflector ...
@ # ~ # € ~! Właśnie zdałem sobie sprawę, że nowa wersja nie jest darmowa! Tak więc, jeśli masz darmową wersję odbłyśnika .NET, możesz go użyć do sprawdzenia platformy docelowej.
Bardziej zaawansowaną aplikację do tego można znaleźć tutaj: CodePlex - ApiChange
Przykłady:
C:\Downloads\ApiChange>ApiChange.exe -CorFlags c:\Windows\winhlp32.exe
FileName;Type;Size;Processor; IL Only;Signed
winhlp32.exe;Unmanaged;296960; X86
C:\Downloads\ApiChange>ApiChange.exe -CorFlags c:\Windows\HelpPane.exe
FileName;Type;Size;Processor; IL Only;SignedHelpPane.exe;Unmanaged;733696;Amd64
Odpowiedzi:
Patrzeć na
System.Reflection.AssemblyName.GetAssemblyName(string assemblyFile)
Możesz sprawdzić metadane zestawu z zwróconej instancji AssemblyName:
Za pomocą programu PowerShell :
Tutaj ProcessorArchitecture identyfikuje platformę docelową.
Korzystam z programu PowerShell w tym przykładzie do wywołania metody.
źródło
[reflection.assemblyname]::GetAssemblyName("${pwd}\name.dll")
ponieważ czasami bieżący katalog procesu nie jest taki sam jak bieżący dostawca (w którym zakładam, że biblioteka DLL jest dla Ciebie)// DevDiv 216459: This code originally used Assembly.GetName(), but that requires FileIOPermission, which isn't granted in medium trust. However, Assembly.FullName *is* accessible in medium trust.
Niestety nie ma możliwości odczytania architektury procesora bez użyciaGetName instance method
; przy użyciuAssemblyName constructor
pole jest zawsze ustawione naNone
.Możesz użyć narzędzia CorFlags CLI (na przykład C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0 \ Bin \ CorFlags.exe), aby określić status zestawu na podstawie jego danych wyjściowych i otwarcia zestawu jako binarny zasób, powinieneś być w stanie określić, gdzie musisz szukać, czy flaga 32BIT jest ustawiona na 1 ( x86 ) lub 0 ( dowolny procesor lub x64 , w zależności od
PE
):W poście na blogu x64 Development with .NET znajduje się kilka informacji na temat
corflags
.Co więcej, możesz użyć,
Module.GetPEKind
aby określić, czy zestaw jestPortableExecutableKinds
wartościąPE32Plus
(64-bit),Required32Bit
(32-bit i WOW) lubILOnly
(dowolny procesor) wraz z innymi atrybutami.źródło
Dla wyjaśnienia, CorFlags.exe jest częścią zestawu .NET Framework SDK . Mam narzędzia programistyczne na moim komputerze, a najprostszym sposobem na określenie, czy biblioteka DLL jest 32-bitowa, jest:
Otwórz wiersz polecenia programu Visual Studio (w systemie Windows: menu Start / Programy / Microsoft Visual Studio / Visual Studio Tools / Visual Studio 2008 Wiersz polecenia)
CD do katalogu zawierającego daną bibliotekę DLL
Uruchom corflags w następujący sposób:
corflags MyAssembly.dll
Otrzymasz coś takiego:
Zgodnie z komentarzami powyższe flagi należy rozumieć następująco:
źródło
32BITREQ
i32BITPREF
zamiast pojedynczej32BIT
wartości.Co powiesz na napisanie własnego? Rdzeń architektury PE nie został poważnie zmieniony od czasu jego implementacji w Windows 95. Oto przykład C #:
Teraz obecne stałe to:
Ale dzięki tej metodzie pozwala ona na możliwości nowych stałych, wystarczy zweryfikować zwrot według własnego uznania.
źródło
Spróbuj użyć CorFlagsReader z tego projektu w CodePlex . Nie ma odniesień do innych zestawów i może być używany w takiej postaci, w jakiej jest.
źródło
DotPeek od JetBrians zapewnia szybki i łatwy sposób zobaczenia msil (anycpu), x86, x64
źródło
źródło
Poniżej znajduje się plik wsadowy, który będzie działał
corflags.exe
dla wszystkichdlls
orazexes
w bieżącym katalogu roboczym i wszystkich podkatalogach, analizował wyniki i wyświetlał architekturę docelową każdego z nich.W zależności od wersji
corflags.exe
, która jest używana, gdy pozycje w wyjścia albo będzie zawierać32BIT
, lub32BITREQ
(i32BITPREF
). Którykolwiek z tych dwóch elementów jest uwzględniony w danych wyjściowych, jest to krytyczny element zamówienia, który należy sprawdzić, aby odróżnić odAny CPU
ix86
. Jeśli używasz starszej wersjicorflags.exe
(wcześniejszej wersji Windows SDK 8.0A), tylko wynik32BIT
będzie obecny na wyjściu, jak wskazali inni w poprzednich odpowiedziach. W przeciwnym razie32BITREQ
i32BITPREF
wymień go.Zakłada się, że
corflags.exe
jest w%PATH%
. Najprostszym sposobem zapewnienia tego jest użycieDeveloper Command Prompt
. Możesz też skopiować go z domyślnej lokalizacji .Jeśli plik wsadowy poniżej jest uruchamiany z niezarządzanym
dll
lubexe
, niepoprawnie wyświetli go jakox86
, ponieważ rzeczywiste wyjście zCorflags.exe
będzie komunikatem o błędzie podobnym do:źródło
Jeszcze jednym sposobem byłoby użycie śmietnika z narzędzi Visual Studio na DLL i poszukiwanie odpowiedniego wyjścia
Uwaga: powyżej o / p jest dll dla 32-bitów
Jeszcze jedną przydatną opcją z dumpbin.exe jest / EXPORTS, pokaże ci funkcję ujawnioną przez dll
źródło
Bardziej ogólny sposób - użyj struktury pliku, aby określić bitowość i typ obrazu:
Wyliczanie trybu kompilacji
Kod źródłowy z wyjaśnieniem na GitHub
źródło
Sklonowałem bardzo przydatne narzędzie, które dodaje pozycję menu kontekstowego dla zestawów w Eksploratorze Windows, aby wyświetlić wszystkie dostępne informacje:
Pobierz tutaj: https://github.com/tebjan/AssemblyInformation/releases
źródło
Innym sposobem sprawdzenia platformy docelowej zestawu .NET jest sprawdzenie zestawu za pomocą .NET Reflector ...
@ # ~ # € ~! Właśnie zdałem sobie sprawę, że nowa wersja nie jest darmowa! Tak więc, jeśli masz darmową wersję odbłyśnika .NET, możesz go użyć do sprawdzenia platformy docelowej.
źródło
cfeduke zauważa możliwość wywołania GetPEKind. Potencjalnie interesujące jest to zrobić z PowerShell.
Oto na przykład kod polecenia cmdlet, którego można użyć: https://stackoverflow.com/a/16181743/64257
Alternatywnie na https://stackoverflow.com/a/4719567/64257 można zauważyć, że „w rozszerzeniach społeczności PowerShell znajduje się również polecenie cmdlet Get-PEHeader, które można wykorzystać do testowania obrazów wykonywalnych”.
źródło
Bardziej zaawansowaną aplikację do tego można znaleźć tutaj: CodePlex - ApiChange
Przykłady:
źródło
Alternatywą dla już wspomnianych narzędzi jest Telerik JustDecompile (darmowe narzędzie), które wyświetla informacje obok nazwy zestawu:
źródło