Apa tujuan dari pengaturan "Lebih suka 32-bit" di Visual Studio dan bagaimana cara kerjanya?

204

Masukkan deskripsi gambar di sini

Tidak jelas bagi saya bagaimana kompiler akan secara otomatis tahu untuk mengkompilasi untuk 64-bit ketika perlu. Bagaimana ia tahu kapan ia bisa menargetkan 32-bit dengan percaya diri?

Saya terutama ingin tahu tentang bagaimana kompiler tahu arsitektur mana yang harus ditargetkan ketika mengkompilasi. Apakah itu menganalisis kode dan membuat keputusan berdasarkan apa yang ditemukannya?

Harun
sumber
Ah terima kasih. Tidak melihat itu sebelumnya. Saya masih penasaran bagaimana kompiler secara otomatis mengetahui arsitektur mana yang akan ditargetkan. Ada ide?
Aaron

Jawaban:

219

Microsoft memiliki entri blog What AnyCPU Really Means As. NET 4.5 dan Visual Studio 11 :

Dalam .NET 4.5 dan Visual Studio 11 keju telah dipindahkan. Default untuk sebagian besar proyek .NET lagi AnyCPU, tetapi ada lebih dari satu makna untuk AnyCPU sekarang. Ada sub-tipe tambahan dari AnyCPU, “Any CPU 32-bit prefered”, yang merupakan default baru (secara keseluruhan, sekarang ada lima opsi untuk sakelar kompiler / platform C #: x86, Itanium, x64, anycpu, dan anycpu32bitpreferred ). Saat menggunakan rasa "Memilih 32-Bit" dari AnyCPU, semantiknya adalah sebagai berikut:

  • Jika proses berjalan pada sistem Windows 32-bit, itu berjalan sebagai proses 32-bit. IL dikompilasi ke kode mesin x86.
  • Jika proses berjalan pada sistem Windows 64-bit, itu berjalan sebagai proses 32-bit. IL dikompilasi ke kode mesin x86.
  • Jika proses berjalan pada sistem Windows ARM, itu berjalan sebagai proses 32-bit. IL dikompilasi ke kode mesin ARM.

Perbedaannya, kemudian, antara "Setiap CPU 32-bit lebih disukai" dan "x86" hanya ini: aplikasi .NET yang dikompilasi ke x86 akan gagal berjalan pada sistem Windows ARM, tetapi aplikasi "Apa saja CPU 32-bit disukai" akan berjalan dengan sukses.

Lex Li
sumber
12
+1. Juga, kotak centang "Lebih suka 32-bit" hanya diaktifkan untuk proyek yang dapat dieksekusi .NET 4.5+.
Lee Grissom
12
Keuntungan lain dari anycpu32bitspreferred adalah .exe lain yang berjalan dalam 64 bit dapat memuat rakitan itu.
Bruno Martinez
30
Secara pribadi saya pikir itu mengerikan mereka mengatur ini secara default tanpa pengaturan Alat untuk mematikannya. Lebih buruk lagi, Anda tidak dapat mencarinya karena tidak ada dalam file csproj kecuali dimatikan! Mungkin ditambahkan karena Office Automation tidak kompatibel dengan CPUAny pada mesin x64 dengan kebanyakan orang memasang Office 32 bit.
Dave
6
@BrianDavidBerman ada, jika Anda menetapkan false ke 32-tetapi lebih disukai dan mengatur x64 atau CPU Apa pun pada mesin 64-bit.
Lex Li
6
Perbedaan antara x86 dan Any CPU 32 bit lebih disukai adalah bahwa dalam kasus yang terakhir flag largeressressware diatur pada executable. Ini berarti bahwa proses 32 bit yang berjalan pada OS 64 bit dapat menggunakan memori 2GB dalam mode x86 dan memori 4GB dalam mode apa pun yang disukai CPU 32 bit.
Nic
6

Inilah jawaban sederhana:

Lengkungan aplikasi.

Catatan: AnyCPU-32bitPreferred hanya tersedia dalam .Net versi 4.5 dan lebih tinggi.

Yousha Aleayoub
sumber
2
Apa perbedaan antara "berjalan sebagai 32-bit" vs berjalan sebagai "WoW64". Saya pikir WoW64 = "Windows (32-bit) pada Windows64" dan diperlukan untuk menjalankan aplikasi 32-bit.
Peter Cordes
Apakah ada sumber untuk ini? Tampaknya di tempat lain masih memberi tahu saya defaultnya adalah anycpu32bitpreferred, yang merupakan perbedaan besar bagi orang yang menggunakan mesin windows 64bit (itu banyak).
Ran Sagy
@RanSagy Anda cukup mengujinya dengan membuat proyek baru dan memeriksa Project -> Properties -> Build tab -> Platform target... tetapi perhatikan bahwa AnyCPU-32bitPreferredhanya tersedia dalam .Net versi 4.5 dan lebih tinggi. Itu sebabnya defaultnya adalah AnyCPU.
Yousha Aleayoub
Dalam beberapa kasus tambang saya diklik; Saya hanya berharap ada beberapa dokumentasi tentang apa yang terjadi di .net 4.5+ atau .net standard / core (atau benar-benar, MSBuild 16)
Ran Sagy
-1

Alasannya adalah: jika Anda tidak ingin menggunakan lebih banyak memori dengan aplikasi 64 bit. Yang berarti, jika aplikasi Anda adalah AnyCPU , Anda ingin menjalankan sebagai 32 bit.

Untuk menambahkan lebih banyak, pengaturan di Visual Studio menargetkan CLR tertentu:

Visual Studio menginstal versi 32-bit CLR pada komputer x86, dan versi 32-bit dan versi 64-bit yang sesuai dari CLR pada komputer Windows 64-bit. (Karena Visual Studio adalah aplikasi 32-bit, ketika diinstal pada sistem 64-bit, itu berjalan di bawah WOW64.)

Silakan merujuk ke artikel Aplikasi 64-bit ( MSDN ).

Peru
sumber
1
Saya tidak yakin itu akurat. Seperti, ini pemahaman saya bahwa .NET yang dapat dieksekusi terlepas dari 32 atau 64 masih terbatas sekitar 2 GB per proses.
JP Richardson
1
Sunting jawaban saya. Tapi tidak yakin apakah ini yang Anda cari :)
Peru
2
@ Harun, kompiler pada dasarnya menetapkan flag untuk runtime untuk memutuskan apakah boleh memuat majelis (mis. Blok perakitan x86-only yang akan dimuat dalam proses x64) dan bagaimana memulai proses (untuk EXE baru) berdasarkan pada flag. Saya percaya IL sama untuk kedua rasa.
Alexei Levenkov
1
@ JPRichardson Ya Anda benar. Namun dalam .net 4.5 Anda memiliki opsi untuk menambah ukuran. lihat MSDN
Peru
40
@ JPRichardson, baik 32 atau 64 bit. Net dapat dieksekusi terbatas hingga 2GB per proses - pertama-tama ruang alamat per-proses adalah pembatasan level OS (2/3 + GB untuk proses 32bit dan lebih banyak untuk 64bit), kedua bahkan versi 32bit dapat gunakan lebih dari 2GB jika bendera "LargeAddressAware" diatur pada executable. Satu-satunya batasan 2GB yang saya tahu adalah tentang ukuran array / alokasi yang dibatasi oleh kisaran Int32 (sekitar 2GB).
Alexei Levenkov