Visual Studio “Any CPU” hedefi ne anlama geliyor?


496

Visual Studio 2008'de .NET platform oluşturma seçenekleri ile ilgili bazı karışıklıklar var.

"Herhangi bir CPU" derleme hedefi nedir ve ne tür dosyalar oluşturur? Bu "Herhangi bir CPU" derlemesinin çıktı yürütülebilir dosyasını inceledim ve x86 çalıştırılabilir dosyaları olduğunu gördüm. Yani, yürütülebilir herhangi bir x86 vs "Any CPU" arasında herhangi bir fark var mı?

Fark ettiğim başka bir şey de, yönetilen C ++ projelerinin bir seçenek olarak bu platforma sahip olmaması. Neden? Bu, "Herhangi bir CPU" yürütülebilir 32 bit olan herhangi bir CPU şüphem doğru olduğu anlamına mı geliyor?


4
Hangi platform hedefinin kullanılacağına karar verirken göz önünde bulundurmanız gereken bir şey daha var: Başlangıç ​​projesinin hedefi ise Any CPUve 64 bit bir işletim sisteminde çalıştırıyorsanız, hata ayıklama sırasında Düzenleme ve devam etme yeteneğini kaybedersiniz . (64bit işleminde etkili bir şekilde hata ayıklama yapıyorsunuz). Hata ayıklama sırasında bunu önlemek için Başlangıç ​​projesi hedefini yapabilirsiniz x86. (Başlangıç ​​projesinden referans alınan meclisler hedeflenmeye devam edebilir Any CPU.
Cristian Diaconescu

8
@CristiDiaconescu VS2013 ile Düzenleme ve devam etme artık mümkün
ms007

Burada, projenin bir uygulama mı yoksa bir sınıf kütüphanesi mi olduğuna dair bir not olması gerektiğini düşünüyorum, çünkü ikincisi için hedef bitini ayarlamak, platforma bağlı olarak uygulamaların tüketilebilirliğini etkileyebilir. Bir yük hatası önlemek için ayarlamak zorunda olduğu x86bir AnyCPUuygulama tarafından tüketilen bir kütüphane ile bu koştu Prefer 32-bit.
SteveCinq

Yanıtlar:


386

Bir AnyCPU derlemesi, 64-bit bir işleme yüklendiğinde 64-bit koda ve 32-bit bir işleme yüklendiğinde 32 bit'e JIT katar .

CPU'yu sınırlandırarak şöyle derdiniz: Montaj tarafından 32 bit veya 64 bit gerektiren bir şey (muhtemelen yönetilmeyen bir şey) kullanılıyor.


3
öyleyse, nasıl C ++ x64 JIT olacak montaj üretebilirim?
Galets

50
C ++ projeleri yerel koda derlenir, bu nedenle JIT derleyicisi dahil değildir ... böylece, ne istersen yapamazsın.
cplotts

7
@cplotts: @galets bu soruyu 3 ay önce sorduğundan beri cevabınızı göremez. Cevabınız hakkında bir uyarı alması için yorumunuzdaki @ galets önekini kullanın.
AnthonyWJones

4
@AnthonyWJones Genel olarak haklısınız, kullanıcının sorununun OP olduğu yerler hariç, bu durumda olduğu gibi, tüm yorumlardan haberdar edilecektir.
Mark Hurd

12
@MarkHurd Aslında, bu durumda, OP bildirilmez. OP'ler , özellikle @ sözdizimine pinglenmedikçe yanıtlara yapılan yorumlardan haberdar olmazlar. OP'ler yalnızca orijinal sorularına eklenen yorumlardan otomatik olarak haberdar edilir.
RSW

322

Önemli şeylerin çoğunun söylendiğini düşünüyorum, ama sadece bir şey ekleyeceğimi düşündüm: Herhangi bir CPU olarak derlerseniz ve bir x64 platformunda çalışırsanız, 32 bit DLL dosyalarını yükleyemezsiniz, çünkü uygulamanız WoW64'te başlatılmadı , ancak bu DLL dosyalarının orada çalışması gerekiyor.

X86 olarak derlerseniz, x64 sistemi uygulamanızı WoW64'te çalıştıracak ve 32 bit DLL dosyalarını yükleyebileceksiniz.

Bu nedenle, bağımlılıklarınız her iki ortamda da çalışabiliyorsa "Herhangi bir CPU" yu seçmeniz gerektiğini, ancak 32 bit bağımlılıklarınız varsa x86'yı seçmeniz gerektiğini düşünüyorum. Microsoft'un bu makalesi bunu biraz açıklıyor:

/ CLRIMAGETYPE (CLR Görüntü Türünü Belirtin)

Bu arada, bu diğer Microsoft belgeleri x86'nın genellikle daha taşınabilir bir seçim olduğunu kabul eder:

X86 seçimi, neredeyse her cihazda çalışacağı için genellikle bir uygulama paketi için en güvenli yapılandırmadır. Bazı cihazlarda, Xbox veya bazı IoT Core cihazları gibi x86 yapılandırmasına sahip bir uygulama paketi çalışmaz. Ancak, bir PC için x86 paketi en güvenli seçimdir ve cihaz dağıtımı için en geniş erişime sahiptir. Windows 10 cihazlarının önemli bir kısmı Windows'un x86 sürümünü çalıştırmaya devam ediyor.


2
Yanıtınızı, belirli bir DLL dosyasının yalnızca 32 bit olup olmadığını nasıl belirleyeceğini söylemek için düzenleyebilirsiniz. Bildiğim kadarıyla, bunu anlamak gerekir. Bence sadece x86 yerine "Any CPU" olan DLL'leri de umuyoruz.
Dan W

+1 önemli bir ayrım. 32 bit bağımlılık kullanması gerekiyordu (ki bu böyle tanımlanmadı). Şifreli çalışma zamanı hata mesajları çözülemedi. Bir öbek üzerinde cpu hedefi değişti ve işe yaradı ama "neden" aramaya gitti. Her şey 64 bit olduğunda ve uyumsuzluk sorunları 16bit vs 32bit gibi ilginç görünecek bir gün güzel olacak.
Gerald Davis

2
@GeraldDavis - Kabul ediyorum. İroni, 32-bit ve 64-bit bağımlılıkları (sadece CLR'de bir thunking katmanının eksikliği) karıştıramamak için teknolojik bir neden yok ve bit gördüğümde .NET'in ilk günlerinde hayal kırıklığına uğradım. ness konuşlandırılırken göz önünde bulundurulması gereken bir şeydi (bunun bir VM / JIT olduğu düşünüldüğünde, biraz daha fazla katma değer sağlamak için bir fırsat olurdu).
codenheim

1
@mrjoltcola: Microsoft'un bu nedenle, ekran renkleri, varsayılan ayarlar vb. şeyleri kontrol etseler bile kayıt defteri girişlerinin 32 bit ve 64 bit evrene bölünmesi gerektiğini anlayamıyorum.
supercat

Aradığım cevap bu ... Teşekkürler!
Daminion Software'den Murat

52

İşte farklı oluşturma hedeflerini açıklayan hızlı bir genel bakış .

Kendi tecrübelerime göre, hem x86 hem de x64 platformlarında çalışacak bir proje oluşturmak istiyorsanız ve belirli bir x64 optimizasyonunuz yoksa, derlemeyi özellikle "x86" diyecek şekilde değiştirirdim.

Bunun nedeni bazen çarpışan bazı DLL dosyalarını veya x64 ortamında WoW çökmesini rüzgarlar bazı kod alabilirsiniz . X86 OS özellikle x86 belirterek, uygulamayı saf bir x86 uygulaması olarak ele alır ve her şeyin düzgün çalıştığından emin olur.


37
Bir sunucu ortamı için yazmanız ve uygulamanızın 2GB'tan fazla bellek kullanabilmesini istiyorsanız, bu korkunç olabilir. Ayrıca, bir gün borudan gelebilecek x64 JIT optimizasyonlarını da devre dışı bırakıyorsunuz.
Austin Harris

AnyCPU derlemeleri ile yaşadığım çalışma zamanı sorunları miktarı, birisi açıkça her ikisinde de çalışan ikili dosyalar istemedikçe, bir yapı seçeneği olarak kullanmayı durdurmak için gereken tüm gerekçe. 10 yıldan fazla bir süredir x64 üzerinde x86 ikili dosyası istememiştim.
KayleeFrye_onDeck

2
"X64 İşletim Sistemi, özellikle x86 belirterek, uygulamayı saf bir x86 uygulaması olarak görür ve her şeyin düzgün çalıştığından emin olur." - Üzgünüm, katılmıyorum. x64 OS hala x86 uygulamanızı bir WOW64 içinde çalıştırır
Mandeep Janjua

Bu, etkisini tam olarak anlamayan birine kötü bir tavsiye. @AustinHarris harika bir örnek veriyor. Bir web çalışanı sürecinin sadece birkaç GB RAM ile sınırlı olduğunu düşünün (son zamanlarda üretimde bununla uğraşmak zorunda kaldım).
rgoliveira

47

Visual Studio .NET Platform Hedef Açıklaması makalesine göz atın .

Varsayılan ayar olan "Herhangi Bir CPU", derlemenin o anda çalıştığı CPU'da yerel olarak çalışacağı anlamına gelir. Yani, 64 bit makinede 64 bit ve 32 bit makinede 32 bit olarak çalışacaktır. Derleme 64 bitlik bir uygulamadan çağrılırsa, 64 bitlik bir derleme gibi çalışır.

Yukarıdaki bağlantının koptuğu bildirildi, bu yüzden benzer bir açıklamaya sahip başka bir makale var: AnyCPU Gerçekten .NET 4.5 ve Visual Studio 11'den Ne Demektir


1
Bağlantı kesildi - şimdi park edilmiş bir alana gidiyor.
Jon Adams

Benzer bilgilere sahip ikinci bir makaleye bağlantı ekledim. Alan adının yeniden etkinleştirilmesi durumunda ilk bağlantıyı bıraktım.
DCNYAM


39

"Herhangi bir CPU", program başlatıldığında, .NET Framework'ün işletim sisteminizin bitine bağlı olarak programınızı 32 bit veya 64 bit olarak çalıştırıp çalıştırmayacağı anlamına gelir.

X86 ve Any CPU arasında bir fark vardır : x64 sisteminde, X86 için derlenmiş olan yürütülebilir dosyanız 32-bit yürütülebilir olarak çalışır.

Şüpheleriniz söz konusu olduğunda, Visual Studio 2008 komut satırına gidin ve aşağıdakileri çalıştırın.

dumpbin YourProgram.exe /headers

Size programınızın büyüklüğünü ve çok daha fazlasını söyleyecektir.


7
"Herhangi bir işlemci" de yerleşik ise, dumpbin başlıklarında 32 bit olarak görünecektir.
Kirbinator

34

Herhangi bir CPU, herhangi bir platformda çalışacağı anlamına gelir. Bunun nedeni, yönetilen kodun Java'ya benzer olmasıdır. .NET Framework tarafından çalışma zamanında yorumlanan bir bayt koduna derlenmiş olarak düşünün.

C ++ bu seçeneğe sahip değildir, çünkü platforma özgü makine koduna derlenmiştir.


12
Başka hiç kimsenin yapmadığı sorunun bir kısmını yanıtladığınız için +1 (seçenek olarak AnyCPU'ya sahip olmayan C ++ projeleri hakkında).
cplotts

C ++ / CLI, herhangi bir makine kodu (/ clr: pure) olmadan IL koduna derlenebilir. Ancak sizeof (void *) hala C ++ 'da bir derleme zamanı sabiti olmalıdır; bu nedenle, herhangi bir makine kodu olmasa bile, aynı anda 32 bit ve 64 bit üzerinde çalışacak bir ikili dosya oluşturamazsınız.
Daniel

5

Bu yazıyı okumanızı tavsiye ederim .

AnyCPU kullanırken , semantikler şunlardır:

  • İşlem 32 bit Windows sisteminde çalışıyorsa, 32 bit işlem olarak çalışır. CIL x86 makine koduna göre derlenmiştir.
  • İşlem 64 bit Windows sisteminde çalışıyorsa, 32 bit işlem olarak çalışır. CIL x86 makine koduna göre derlenmiştir.
  • İşlem bir ARM Windows sisteminde çalışıyorsa, 32 bitlik bir işlem olarak çalışır. CIL, ARM makine koduna derlenmiştir.

8
Yalnızca "32-bit'i tercih et" seçilirse.
Florian Winter

Visual Studio 11'den beri varsayılan
Moerwald

@Moerwald Bunun düzeltilmiş bir hata olduğuna inanıyorum. Eğer okursanız sonrası mamczas "Mevcut Visual Studio kullanıcı arayüzündeki‘yazar yazıyor da değinmektedir’gerçekte o ... etkin olduğu, gri ve kontrolsüz olduğu" 32-bit tercih; VS (15.8.0) versiyonumda seçenek hala gri ve işaretli değil, ancak beklendiği gibi çalışıyor (derlenmiş montajın CorFlags bölümünde 32BITPREF = FALSE bayrağı)
Raikol Amaro

-1

Visual Studio 2017'de şöyle yaptım:

  • Çözüm gezgininde
  • Projenize sağ tıklayın
  • "Özellikler" i tıklayın
  • "Yapı" yı tıklayın
  • "32 bit tercih et" seçeneğini kapatın
  • Ve Platform hedefinden "x64" ü seçebilirsiniz.

Bu cevap konu dışı.
Jonas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.