Maafkan pertanyaan bodoh - tetapi apa artinya ini memberitahu Anda bahwa itu x86?
George Mauer
53
Bidang ProcessorArchitecture adalah enumerasi; dalam contoh di atas diatur ke MSIL, yang berarti "Netral sehubungan dengan prosesor dan bit per kata." Nilai-nilai lain termasuk X86, IA64, Amd64. Lihat msdn.microsoft.com/en-us/library/… untuk lebih jelasnya.
Brian Gillespie
4
Coba dengan [reflection.assemblyname]::GetAssemblyName("${pwd}\name.dll")kadang-kadang direktori proses saat ini tidak sama dengan penyedia saat ini (yang mana saya menganggap DLL adalah untuk Anda)
x0n
2
Peringatan lain yang harus diperhatikan adalah lupa untuk "membuka blokir" DLL jika Anda mengunduhnya dari internet. Gunakan unblock-file, atau klik kanan / properties / unblock dari explorer. Anda harus memulai ulang shell untuk mengenali status yang tidak diblokir jika Anda sudah gagal sekali dalam sesi saat ini (salahkan penjelajah internet untuk itu - ya, sungguh.)
x0n
1
Dalam kode ASP.NET MVC, ada komentar // 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.Sayangnya, tidak ada cara untuk membaca ProcessorArchitecture tanpa menggunakan GetName instance method; menggunakan AssemblyName constructor, bidang selalu diatur ke None.
metadings
221
Anda dapat menggunakan alat CorFlags CLI (misalnya, C: \ Program Files \ Microsoft SDKs Windows \ v7.0 \ Bin \ CorFlags.exe) untuk menentukan status perakitan, berdasarkan outputnya dan membuka perakitan sebagai aset biner Anda harus dapat menentukan di mana Anda perlu mencari untuk menentukan apakah flag 32BIT diatur ke 1 ( x86 ) atau 0 ( Setiap CPU atau x64 , tergantung pada PE):
Option| PE |32BIT----------|-------|---------
x86 | PE32 |1Any CPU | PE32 |0
x64 | PE32+|0
Bahkan lebih baik, Anda dapat menggunakanModule.GetPEKind untuk menentukan apakah suatu perakitan PortableExecutableKindsbernilai PE32Plus(64-bit), Required32Bit(32-bit dan WOW), atau ILOnly(CPU apa saja) bersama dengan atribut lainnya.
Setelah melihat pembaruan Anda, menggunakan GetPEKind tampaknya menjadi cara yang tepat untuk melakukan ini. Saya menandai jawaban Anda sebagai jawabannya.
Yehuda Gabriel Himango
9
GetPEKind gagal dalam proses 64 bit saat memeriksa 32 bit rakitan
jjxtra
2
Anda harus memanggil GetPEKind dari proses 32bit
Ludwo
2
Saya menginstal VS 2008, VS 2010, VS 2012 dan VS 2013. Saya punya 8 file CorFlags.exe di subfolder di C: \ Program Files (x86) \ Microsoft SDKs \ Windows \. Yang mana yang harus saya gunakan?
Kiquenet
5
Seperti yang ditunjukkan dalam jawaban ini , di .NET 4.5 ada 32BITREQ dan 32BITPREF sebagai ganti flag 32BIT. PE32 / 0/0 dan PE32 / 0/1 masing-masing adalah AnyCPU dan AnyCPU 32-bit.
angularsen
141
Hanya untuk klarifikasi, CorFlags.exe adalah bagian dari .NET Framework SDK . Saya memiliki alat pengembangan di komputer saya, dan cara paling sederhana bagi saya untuk menentukan apakah DLL hanya 32-bit adalah dengan:
Buka Visual Studio Command Prompt (Di Windows: menu Start / Programs / Microsoft Visual Studio / Visual Studio Tools / Visual Studio 2008 Command Prompt)
CD ke direktori yang berisi DLL yang dimaksud
Jalankan corflags seperti ini:
corflags MyAssembly.dll
Anda akan mendapatkan hasil seperti ini:
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
Sesuai komentar, bendera di atas harus dibaca sebagai berikut:
Bagaimana kalau Anda hanya menulis milik Anda sendiri? Inti dari arsitektur PE belum berubah secara serius sejak penerapannya pada Windows 95. Berikut ini adalah contoh 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;}}
Sekarang konstanta saat ini adalah:
0x10B- PE32 format.0x20B- PE32+ format.
Tetapi dengan metode ini memungkinkan untuk kemungkinan konstanta baru, hanya memvalidasi pengembalian sesuai keinginan Anda.
Menarik, terima kasih untuk kodenya dengan penjelasan. Module.GetPEKind mungkin jalan yang paling mudah. Tetapi ini bermanfaat untuk pembelajaran. Terima kasih.
Yehuda Gabriel Himango
3
Sangat menarik tetapi ketika saya memiliki aplikasi yang dikompilasi dengan CPU Apa pun, hasilnya adalah 0x10B. Ini salah karena aplikasi saya dijalankan di sistem x64. Apakah ada bendera lain untuk diperiksa?
Samuel
GetPEArchitecture berfungsi untuk rakitan yang dikompilasi menggunakan .net 3.5, 4.0, 4.5 dan 4.5.1? Bagaimanapun, saya pikir, Module.GetPEKind gagal dalam proses 64 bit ketika memeriksa 32 bit rakitan.
Kiquenet
9
Coba gunakan CorFlagsReader dari proyek ini di CodePlex . Itu tidak memiliki referensi ke majelis lain dan dapat digunakan apa adanya.
Ini adalah jawaban yang paling akurat dan bermanfaat.
Kirill Osenkov
Tautannya masih berfungsi hingga tulisan ini dibuat, tetapi karena CodePlex akan ditutup, alangkah baiknya untuk melakukan tindakan yang sesuai sebelum terlambat.
Peter Mortensen
7
DotPeek dari JetBrians menyediakan cara cepat dan mudah untuk melihat msil (anycpu), x86, x64
Terima kasih untuk ini, Salah satu aplikasi kami harus dibangun sebagai x86, menambahkan tes unit memastikan bahwa perpustakaan build server akan menjadi 32bit dan menghindari kesalahan-kesalahan itu terjadi :)
Mido
5
Di bawah ini adalah file batch yang akan berjalan corflags.exemelawan semua dllsdan exesdalam direktori kerja saat ini dan semua sub-direktori, parsing hasil dan menampilkan arsitektur target masing-masing.
Bergantung pada versi corflags.exeyang digunakan, item baris dalam output akan termasuk 32BIT, atau32BITREQ (dan 32BITPREF). Yang mana dari kedua ini yang termasuk dalam output adalah item baris kritis yang harus diperiksa untuk membedakan antara Any CPUdan x86. Jika Anda menggunakan versi yang lebih lama dari corflags.exe(pra Windows SDK v8.0A), maka hanya 32BITitem baris yang akan ada di output, seperti yang lain telah ditunjukkan dalam jawaban sebelumnya. Kalau tidak 32BITREQ, 32BITPREFganti saja.
Asumsi corflags.exeini ada dalam %PATH%. Cara paling sederhana untuk memastikan ini adalah dengan menggunakan a Developer Command Prompt. Atau Anda dapat menyalinnya dari lokasi default itu .
Jika file batch di bawah ini dijalankan terhadap yang tidak dikelola dllatau exe, itu akan salah menampilkannya x86, karena output aktual dari Corflags.exeakan menjadi pesan kesalahan yang mirip dengan:
corflags: error CF008: File yang ditentukan tidak memiliki header terkelola yang valid
@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.
Satu cara lagi adalah dengan menggunakan dumpbin dari alat Visual Studio di DLL dan mencari output yang sesuai
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
Catatan: Di atas o / p untuk 32bit dll
Satu lagi opsi yang berguna dengan dumpbin.exe adalah / EKSPOR, Ini akan menunjukkan kepada Anda fungsi yang diekspos oleh dll
Saya telah mengkloning alat yang sangat berguna yang menambahkan entri menu konteks untuk majelis di windows explorer untuk menampilkan semua info yang tersedia:
Cara lain untuk memeriksa platform target rakitan .NET adalah memeriksa rakitan dengan .NET Reflector ...
@ # ~ # € ~! Saya baru sadar bahwa versi baru itu tidak gratis! Jadi, koreksi, jika Anda memiliki versi gratis .NET reflector, Anda dapat menggunakannya untuk memeriksa platform target.
Aplikasi yang lebih canggih untuk itu dapat Anda temukan di sini: CodePlex - ApiChange
Contoh:
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
Jawaban:
Melihat
System.Reflection.AssemblyName.GetAssemblyName(string assemblyFile)
Anda dapat memeriksa metadata perakitan dari instance AssemblyName yang dikembalikan:
Menggunakan PowerShell :
Di sini, ProcessorArchitecture mengidentifikasi platform target.
Saya menggunakan PowerShell dalam contoh ini untuk memanggil metode.
sumber
[reflection.assemblyname]::GetAssemblyName("${pwd}\name.dll")
kadang-kadang direktori proses saat ini tidak sama dengan penyedia saat ini (yang mana saya menganggap DLL adalah untuk Anda)// 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.
Sayangnya, tidak ada cara untuk membaca ProcessorArchitecture tanpa menggunakanGetName instance method
; menggunakanAssemblyName constructor
, bidang selalu diatur keNone
.Anda dapat menggunakan alat CorFlags CLI (misalnya, C: \ Program Files \ Microsoft SDKs Windows \ v7.0 \ Bin \ CorFlags.exe) untuk menentukan status perakitan, berdasarkan outputnya dan membuka perakitan sebagai aset biner Anda harus dapat menentukan di mana Anda perlu mencari untuk menentukan apakah flag 32BIT diatur ke 1 ( x86 ) atau 0 ( Setiap CPU atau x64 , tergantung pada
PE
):Posting blog Pengembangan x64 dengan .NET memiliki beberapa informasi tentang
corflags
.Bahkan lebih baik, Anda dapat menggunakan
Module.GetPEKind
untuk menentukan apakah suatu perakitanPortableExecutableKinds
bernilaiPE32Plus
(64-bit),Required32Bit
(32-bit dan WOW), atauILOnly
(CPU apa saja) bersama dengan atribut lainnya.sumber
Hanya untuk klarifikasi, CorFlags.exe adalah bagian dari .NET Framework SDK . Saya memiliki alat pengembangan di komputer saya, dan cara paling sederhana bagi saya untuk menentukan apakah DLL hanya 32-bit adalah dengan:
Buka Visual Studio Command Prompt (Di Windows: menu Start / Programs / Microsoft Visual Studio / Visual Studio Tools / Visual Studio 2008 Command Prompt)
CD ke direktori yang berisi DLL yang dimaksud
Jalankan corflags seperti ini:
corflags MyAssembly.dll
Anda akan mendapatkan hasil seperti ini:
Sesuai komentar, bendera di atas harus dibaca sebagai berikut:
sumber
32BITREQ
dan32BITPREF
bukannya32BIT
nilai tunggal .Bagaimana kalau Anda hanya menulis milik Anda sendiri? Inti dari arsitektur PE belum berubah secara serius sejak penerapannya pada Windows 95. Berikut ini adalah contoh C #:
Sekarang konstanta saat ini adalah:
Tetapi dengan metode ini memungkinkan untuk kemungkinan konstanta baru, hanya memvalidasi pengembalian sesuai keinginan Anda.
sumber
Coba gunakan CorFlagsReader dari proyek ini di CodePlex . Itu tidak memiliki referensi ke majelis lain dan dapat digunakan apa adanya.
sumber
DotPeek dari JetBrians menyediakan cara cepat dan mudah untuk melihat msil (anycpu), x86, x64
sumber
sumber
Di bawah ini adalah file batch yang akan berjalan
corflags.exe
melawan semuadlls
danexes
dalam direktori kerja saat ini dan semua sub-direktori, parsing hasil dan menampilkan arsitektur target masing-masing.Bergantung pada versi
corflags.exe
yang digunakan, item baris dalam output akan termasuk32BIT
, atau32BITREQ
(dan32BITPREF
). Yang mana dari kedua ini yang termasuk dalam output adalah item baris kritis yang harus diperiksa untuk membedakan antaraAny CPU
danx86
. Jika Anda menggunakan versi yang lebih lama daricorflags.exe
(pra Windows SDK v8.0A), maka hanya32BIT
item baris yang akan ada di output, seperti yang lain telah ditunjukkan dalam jawaban sebelumnya. Kalau tidak32BITREQ
,32BITPREF
ganti saja.Asumsi
corflags.exe
ini ada dalam%PATH%
. Cara paling sederhana untuk memastikan ini adalah dengan menggunakan aDeveloper Command Prompt
. Atau Anda dapat menyalinnya dari lokasi default itu .Jika file batch di bawah ini dijalankan terhadap yang tidak dikelola
dll
atauexe
, itu akan salah menampilkannyax86
, karena output aktual dariCorflags.exe
akan menjadi pesan kesalahan yang mirip dengan:sumber
Satu cara lagi adalah dengan menggunakan dumpbin dari alat Visual Studio di DLL dan mencari output yang sesuai
Catatan: Di atas o / p untuk 32bit dll
Satu lagi opsi yang berguna dengan dumpbin.exe adalah / EKSPOR, Ini akan menunjukkan kepada Anda fungsi yang diekspos oleh dll
sumber
Cara yang lebih umum - gunakan struktur file untuk menentukan bitness dan tipe gambar:
Enumerasi mode kompilasi
Kode sumber dengan penjelasan di GitHub
sumber
Saya telah mengkloning alat yang sangat berguna yang menambahkan entri menu konteks untuk majelis di windows explorer untuk menampilkan semua info yang tersedia:
Unduh di sini: https://github.com/tebjan/AssemblyInformation/releases
sumber
Cara lain untuk memeriksa platform target rakitan .NET adalah memeriksa rakitan dengan .NET Reflector ...
@ # ~ # € ~! Saya baru sadar bahwa versi baru itu tidak gratis! Jadi, koreksi, jika Anda memiliki versi gratis .NET reflector, Anda dapat menggunakannya untuk memeriksa platform target.
sumber
cfeduke mencatat kemungkinan memanggil GetPEKind. Ini berpotensi menarik untuk melakukan ini dari PowerShell.
Di sini, misalnya, adalah kode untuk cmdlet yang dapat digunakan: https://stackoverflow.com/a/16181743/64257
Atau, di https://stackoverflow.com/a/4719567/64257 dicatat bahwa "ada juga cmdlet Get-PEHeader di PowerShell Community Extensions yang dapat digunakan untuk menguji gambar yang dapat dieksekusi."
sumber
Aplikasi yang lebih canggih untuk itu dapat Anda temukan di sini: CodePlex - ApiChange
Contoh:
sumber
Alternatif untuk alat yang telah disebutkan adalah Telerik JustDecompile (alat gratis) yang akan menampilkan informasi di sebelah nama majelis:
sumber