Saya memiliki beberapa kebingungan terkait dengan opsi .NET platform build di Visual Studio 2008.
Apa target kompilasi "Any CPU", dan jenis file apa yang dihasilkannya? Saya memeriksa executable output dari build "Any CPU" ini dan menemukan bahwa mereka adalah executable x86 (yang tidak akan melihatnya!). Jadi, apakah ada perbedaan antara penargetan yang dapat dieksekusi ke x86 vs "Any CPU"?
Hal lain yang saya perhatikan, adalah bahwa proyek C ++ yang dikelola tidak memiliki platform ini sebagai opsi. Mengapa demikian? Apakah itu berarti bahwa kecurigaan saya tentang executable "Any CPU" menjadi yang 32-bit benar?
.net
visual-studio-2008
build
64-bit
galet
sumber
sumber
Any CPU
dan Anda menjalankan OS 64 bit, Anda kehilangan kemampuan untuk Mengedit dan melanjutkan saat debugging. (Anda secara efektif men-debug proses 64bit). Anda bisa membuat target proyek Startupx86
untuk mengelak dari ini saat debugging. (Majelis yang dirujuk dari proyek startup dapat terus menargetkanAny CPU
.x86
perpustakaan sedang dikonsumsi olehAnyCPU
aplikasi di mana saya harus mengaturPrefer 32-bit
untuk menghindari kesalahan memuat.Jawaban:
Sebuah AnyCPU perakitan akan JIT kode 64-bit saat dimuat ke dalam proses 64-bit dan 32 bit saat dimuat ke dalam proses 32-bit.
Dengan membatasi CPU Anda akan mengatakan: Ada sesuatu yang digunakan oleh majelis (sesuatu yang kemungkinan tidak dikelola) yang membutuhkan 32 bit atau 64 bit.
sumber
Saya pikir sebagian besar hal penting telah dikatakan, tetapi saya hanya berpikir saya akan menambahkan satu hal: Jika Anda mengkompilasi sebagai Any CPU dan berjalan pada platform x64, maka Anda tidak akan dapat memuat file DLL 32-bit, karena aplikasi Anda tidak dimulai di WoW64 , tetapi file DLL tersebut perlu dijalankan di sana.
Jika Anda mengkompilasi sebagai x86, maka sistem x64 akan menjalankan aplikasi Anda di WoW64, dan Anda akan dapat memuat file DLL 32-bit.
Jadi saya pikir Anda harus memilih "Any CPU" jika dependensi Anda dapat berjalan di lingkungan mana pun, tetapi pilih x86 jika Anda memiliki dependensi 32-bit. Artikel dari Microsoft ini menjelaskan sedikit:
/ CLRIMAGETYPE (Tentukan Jenis Gambar CLR)
Secara kebetulan, dokumentasi Microsoft lainnya ini setuju bahwa x86 biasanya merupakan pilihan yang lebih portabel:
sumber
Berikut ini ikhtisar singkat yang menjelaskan berbagai target pembangunan.
Dari pengalaman saya sendiri, jika Anda ingin membangun sebuah proyek yang akan berjalan pada platform x86 dan x64, dan Anda tidak memiliki optimisasi x64 spesifik, saya akan mengubah build untuk secara spesifik mengatakan "x86."
Alasan untuk ini adalah kadang-kadang Anda bisa mendapatkan beberapa file DLL yang bertabrakan atau kode yang akhirnya menabrak WoW di lingkungan x64. Dengan menentukan secara spesifik x86, OS x64 akan memperlakukan aplikasi sebagai aplikasi x86 murni dan memastikan semuanya berjalan dengan lancar.
sumber
Lihat artikel Visual Studio .NET Platform Target Dijelaskan .
Tautan di atas telah dilaporkan rusak, jadi di sini ada artikel lain dengan penjelasan yang serupa: Apa Artinya AnyCPU Berarti .NET 4.5 dan Visual Studio 11
sumber
Kredit ke buku "CLR via C #" , lihat ini:
sumber
"Any CPU" berarti bahwa ketika program dimulai, .NET Framework akan mencari tahu, berdasarkan bitness OS, apakah akan menjalankan program Anda dalam 32 bit atau 64 bit.
Ada perbedaan antara x86 dan Any CPU : pada sistem x64, executable Anda yang dikompilasi untuk X86 akan berjalan sebagai executable 32-bit.
Sejauh kecurigaan Anda, cukup buka baris perintah Visual Studio 2008 dan jalankan yang berikut.
Ini akan memberi tahu Anda betapa kecilnya program Anda, ditambah lebih banyak lagi.
sumber
CPU apa pun berarti bahwa itu akan berfungsi pada platform apa pun. Ini karena kode terkelola mirip dengan Java. Anggap saja dikompilasi ke kode byte yang ditafsirkan oleh .NET Framework saat dijalankan.
C ++ tidak memiliki opsi ini karena dikompilasi ke kode mesin yang spesifik platform.
sumber
Saya merekomendasikan membaca posting ini .
Saat menggunakan AnyCPU , semantiknya adalah sebagai berikut:
sumber