IntPtr.Size tidak akan mengembalikan nilai yang benar jika berjalan dalam 32-bit .NET Framework 2.0 pada Windows 64-bit (ini akan mengembalikan 32-bit).
Seperti yang dijelaskan oleh Raymond Chen dari Microsoft, Anda harus terlebih dahulu memeriksa apakah berjalan dalam proses 64-bit (saya pikir dalam. NET Anda dapat melakukannya dengan memeriksa IntPtr.Size), dan jika Anda menjalankan proses 32-bit, Anda masih harus memanggil fungsi Win API IsWow64Process. Jika ini mengembalikan true, Anda sedang menjalankan proses 32-bit pada Windows 64-bit.
Microsoft Raymond Chen:
Cara mendeteksi secara terprogram apakah Anda menjalankan Windows 64-bit
Solusi saya:
static bool is64BitProcess = (IntPtr.Size == 8);
static bool is64BitOperatingSystem = is64BitProcess || InternalCheckIsWow64();
[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWow64Process(
[In] IntPtr hProcess,
[Out] out bool wow64Process
);
public static bool InternalCheckIsWow64()
{
if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) ||
Environment.OSVersion.Version.Major >= 6)
{
using (Process p = Process.GetCurrentProcess())
{
bool retVal;
if (!IsWow64Process(p.Handle, out retVal))
{
return false;
}
return retVal;
}
}
else
{
return false;
}
}
System.Environment.Is64BitOperatingSystem
. Bisakah Anda mengedit ini menjadi jawaban Anda, atau memberi saya izin untuk mengeditnya menjadi jawaban Anda?.NET 4 memiliki dua properti baru di kelas Lingkungan, Is64BitProcess dan Is64BitOperatingSystem . Menariknya, jika Anda menggunakan Reflector Anda dapat melihat mereka diimplementasikan secara berbeda dalam versi 32-bit & 64-bit dari mscorlib. Versi 32-bit mengembalikan false untuk Is64BitProcess dan memanggil IsWow64Process melalui P / Invoke untuk Is64BitOperatingSystem. Versi 64-bit hanya mengembalikan true untuk keduanya.
sumber
if (IntPtr.Size == 8) return true; if(!DoesWin32MethodExist(...,"IsWow64Process")) return false; return IsWow64Process(GetCurrentProcess());
(pseudo-code)Is64BitProcess
danIs64BitOperatingSystem
(tautan untuk versi 2.0).Jika Anda menggunakan .NET Framework 4.0, mudah:
Lihat Environment.Is64BitOperatingSystem Property (MSDN).
sumber
Ini hanya implementasi dari apa yang disarankan di atas oleh Bruno Lopez, tetapi bekerja pada Win2k + semua paket layanan WinXP. Baru saja tahu saya akan mempostingnya sehingga orang lain tidak perlu menggulungnya dengan tangan. (akan diposting sebagai komentar, tapi saya pengguna baru!)
sumber
Jawaban lengkapnya adalah ini (diambil dari jawaban stefan-mg, ripper234 dan BobbyShaftoe):
Pertama periksa apakah Anda sedang dalam proses 64 bit. Jika tidak, periksa apakah proses 32 bit adalah Proses Wow64.
sumber
Microsoft telah menempatkan contoh kode untuk ini:
http://1code.codeplex.com/SourceControl/changeset/view/39074#842775
Ini terlihat seperti ini:
Ada versi WMI juga tersedia (untuk menguji mesin jarak jauh).
sumber
Anda juga dapat memeriksa
PROCESSOR_ARCHITECTURE
variabel lingkungan.Entah itu tidak ada atau diatur ke "x86" pada Windows 32-bit.
sumber
prefer 32-bit
denganAny CPU
sebagai AndaPlatform Target
maka Anda akan mendapatkanx86
, tetapi jika Anda untickPrefer 32-bit
itu Anda kemudian akan mendapatkanAMD64
.Dari blog Chriz Yuen
C # .Net 4.0 Memperkenalkan dua lingkungan properti properti baru Environment.Is64BitOperatingSystem; Lingkungan.Is64Bit Proses;
Harap berhati-hati saat Anda menggunakan kedua properti ini. Tes pada Windows 7 64bits Machine
sumber
Cara tercepat:
Catatan: ini sangat langsung dan bekerja dengan benar pada 64-bit hanya jika program tidak memaksa eksekusi sebagai proses 32-bit (misalnya melalui
<Prefer32Bit>true</Prefer32Bit>
dalam pengaturan proyek).sumber
Coba ini:
sumber
@foobar: Anda benar, itu terlalu mudah;)
Dalam 99% kasus, pengembang dengan latar belakang administrator sistem yang lemah pada akhirnya gagal untuk menyadari kekuatan yang selalu disediakan Microsoft bagi siapa saja untuk menyebutkan Windows.
Administrator sistem akan selalu menulis kode yang lebih baik dan lebih sederhana ketika sampai pada titik seperti itu.
Namun demikian, satu hal yang perlu diperhatikan, konfigurasi build harus AnyCPU untuk variabel lingkungan ini untuk mengembalikan nilai yang benar pada sistem yang benar:
Ini akan mengembalikan "X86" pada Windows 32-bit, dan "AMD64" pada Windows 64-bit.
sumber
Menggunakan dotPeek membantu untuk melihat bagaimana kerangka kerja sebenarnya melakukannya. Dengan mengingat hal itu, inilah yang saya pikirkan:
Contoh penggunaan:
sumber
Gunakan dua variabel lingkungan ini (kode semu):
Lihat posting blog HOWTO: Deteksi Proses Bitness .
sumber
Saya menggunakan pemeriksaan ini dengan sukses di banyak sistem operasi:
Folder ini selalu dinamai "SysWOW64", tidak masalah bahasa sistem operasi. Ini berfungsi untuk .NET Framework 1.1 atau lebih tinggi.
sumber
SysWOW64
pada%windir%
OS 32 bit? Kehadiran folder artinya persis seperti itu: bahwa folder itu ada.Saya perlu melakukan ini, tetapi saya juga harus dapat sebagai admin melakukannya dari jarak jauh, kedua kasus ini tampaknya bekerja dengan baik untuk saya:
sumber
Ini adalah solusi berdasarkan kode Microsoft di http://1code.codeplex.com/SourceControl/changeset/view/39074#842775 . Ini menggunakan metode ekstensi untuk menggunakan kembali kode mudah.
Beberapa kemungkinan penggunaan ditunjukkan di bawah ini:
sumber
Berikut adalah pendekatan langsung dalam C # menggunakan DllImport dari halaman ini .
sumber
IsWow64Process
tidak ada.Saya menggunakan kode followin. Catatan: Ini dibuat untuk proyek AnyCPU.
sumber
Saya menemukan ini sebagai cara terbaik untuk memeriksa platform sistem dan prosesnya:
Properti pertama mengembalikan true untuk sistem 64-bit, dan false untuk 32-bit. Properti kedua mengembalikan true untuk proses 64-bit, dan false untuk 32-bit.
Kebutuhan kedua properti ini adalah karena Anda dapat menjalankan proses 32-bit pada sistem 64-bit, jadi Anda perlu memeriksa sistem dan prosesnya.
sumber
Semua baik-baik saja, tetapi ini juga harus bekerja dari
env
:..
Terlalu mudah, mungkin ;-)
sumber
Berikut ini adalah pendekatan Instrumentasi Manajemen Windows (WMI):
sumber
OSInfo.Bits
sumber
Sertakan kode berikut ke dalam kelas di proyek Anda:
Gunakan seperti ini:
sumber
Gunakan ini untuk mendapatkan arsitektur Windows yang diinstal:
sumber
Mengingat bahwa jawaban yang diterima sangat kompleks. Ada cara yang lebih sederhana. Milik saya adalah variasi dari jawaban alexandrudicu. Mengingat bahwa windows 64-bit menginstal aplikasi 32-bit dalam Program Files (x86) Anda dapat memeriksa apakah folder itu ada, menggunakan variabel lingkungan (untuk menebus pelokalan yang berbeda)
misalnya
Bagi saya ini lebih cepat dan sederhana. Mengingat bahwa saya juga ingin mengakses jalur tertentu di bawah folder itu berdasarkan versi OS.
sumber
Nikmati ;-)
sumber
Lihat saja apakah "C: \ Program Files (x86)" ada. Jika tidak, berarti Anda menggunakan OS 32 bit. Jika ya, maka OS-nya 64 bit (Windows Vista atau Windows 7). Tampaknya cukup sederhana ...
sumber
Saya menggunakan:
Ini mendapatkan jalur di mana aplikasi Anda diluncurkan jika Anda menginstalnya di berbagai tempat di komputer. Juga, Anda bisa melakukan
C:\
jalur umum karena 99,9% komputer di luar sana telah menginstal WindowsC:\
.sumber
Saya menggunakan versi berikut ini:
sumber