विज़ुअल स्टूडियो में "प्राथमिकता 32-बिट" सेटिंग का उद्देश्य क्या है और यह वास्तव में कैसे काम करता है?


204

यहां छवि विवरण दर्ज करें

यह मेरे लिए स्पष्ट नहीं है कि कंपाइलर को 64-बिट के संकलन के लिए कैसे पता चलेगा जब उसे इसकी आवश्यकता होगी। यह कैसे पता चलता है कि यह आत्मविश्वास से 32-बिट को लक्षित कर सकता है?

मैं मुख्य रूप से उत्सुक हूं कि संकलक को पता है कि संकलन करते समय किस वास्तुकला को लक्षित करना है। क्या यह कोड का विश्लेषण करता है और जो इसे पाता है उसके आधार पर निर्णय लेता है?



आह, धन्यवाद। इससे पहले नहीं देखा था। मुझे अभी भी उत्सुकता है कि कैसे संकलक स्वचालित रूप से जानता है कि किस वास्तुकला को लक्षित करना है। कोई विचार?
एरोन

जवाबों:


219

Microsoft के पास एक ब्लॉग प्रविष्टि है जो AnyCPU वास्तव में .NET 4.5 और विजुअल स्टूडियो 11 के रूप में है

.NET 4.5 और विजुअल स्टूडियो 11 में पनीर को स्थानांतरित कर दिया गया है। अधिकांश .NET प्रोजेक्ट्स के लिए डिफ़ॉल्ट फिर से AnyCPU है, लेकिन अब AnyCPU के लिए एक से अधिक अर्थ है। AnyCPU का एक अतिरिक्त उप-प्रकार है, "कोई भी CPU 32-बिट पसंदीदा", जो कि नया डिफ़ॉल्ट है (कुल मिलाकर, अब / प्लेटफ़ॉर्म C # कंपाइलर स्विच के लिए पांच विकल्प हैं: x86, Itanium, x64, anycpu, और anycpu32bitpreferred )। AnyCPU के "प्राथमिकता 32-बिट" स्वाद का उपयोग करते समय, शब्दार्थ इस प्रकार हैं:

  • यदि प्रक्रिया 32-बिट विंडोज सिस्टम पर चलती है, तो यह 32-बिट प्रक्रिया के रूप में चलती है। IL को x86 मशीन कोड में संकलित किया गया है।
  • यदि प्रक्रिया 64-बिट विंडोज सिस्टम पर चलती है, तो यह 32-बिट प्रक्रिया के रूप में चलती है। IL को x86 मशीन कोड में संकलित किया गया है।
  • यदि प्रक्रिया एआरएम विंडोज सिस्टम पर चलती है, तो यह 32-बिट प्रक्रिया के रूप में चलती है। IL को ARM मशीन कोड से संकलित किया गया है।

अंतर, तब, "किसी भी सीपीयू 32-बिट पसंदीदा" और "x86" के बीच केवल यही है: x86 के लिए संकलित एक .NET अनुप्रयोग एआरएम विंडोज सिस्टम पर चलने में विफल रहेगा, लेकिन "कोई भी सीपीयू 32-बिट पसंदीदा" आवेदन सफलतापूर्वक चलेगा।


12
+1। इसके अलावा, "प्राथमिकता 32-बिट" चेकबॉक्स केवल .NET 4.5+ निष्पादन योग्य परियोजनाओं के लिए सक्षम है।
ली ग्रिसॉम

12
Anycpu32bitspreferred का एक और फायदा यह है कि 64 बिट्स में चलने वाला एक और .exe उस असेंबली को लोड कर सकता है।
ब्रूनो मार्टिनेज

30
व्यक्तिगत रूप से मुझे लगता है कि यह भयानक है वे इसे डिफ़ॉल्ट रूप से सेट करते हैं जिसमें कोई टूल सेटिंग नहीं है इसे बंद करें। इससे भी बदतर, आप इसे csproj फाइलों में तब तक नहीं खोज सकते जब तक कि बंद न हो जाए! शायद 32 बिट ऑफिस स्थापित करने वाले अधिकांश लोगों के साथ x64 मशीन पर CPUAny के साथ ऑफिस ऑटोमेशन असंगतताओं के कारण जोड़ा गया है।
डेव

6
@BrianDavidBerman है, अगर आप 32 पर गलत सेट करते हैं, लेकिन 64-बिट मशीन पर x64 या किसी भी सीपीयू को सेट करते हैं।
लेक्स ली

6
X86 और किसी भी सीपीयू 32 बिट के बीच का अंतर यह है कि बाद के मामले में लार्गेडड्रेसवेयर ध्वज निष्पादन योग्य पर सेट है। इसका मतलब है कि 64 बिट ओएस पर चलने वाली 32 बिट प्रक्रिया x86 मोड में 2GB मेमोरी और किसी भी CPU 32 बिट पसंदीदा मोड में 4GB मेमोरी का उपयोग कर सकती है।
निक

6

यहाँ एक सरल जवाब है:

अनुप्रयोग आर्क।

नोट: AnyCPU-32bitPreferred केवल .Net संस्करण 4.5 और उच्चतर में उपलब्ध है।


2
"32-बिट्स के रूप में रन" बनाम "डब्ल्यूओडब्ल्यू 64" के बीच क्या अंतर है। मुझे लगा कि WoW64 = "विंडोज़ (32-बिट) Windows64 पर" और किसी भी 32-बिट एप्लिकेशन को चलाने के लिए आवश्यक था।
पीटर कोर्ड्स

क्या इसका कोई स्रोत है? बाकी सभी जगह अभी भी मुझे बताता है कि डिफॉल्ट anycpu32bitpreferred है, जो 64 बिट विंडोज़ मशीनों पर चलने वाले लोगों के लिए एक बहुत बड़ा अंतर है (यह बहुत कुछ है)।
रैन सागी

@RanSagy आप बस एक नई परियोजना बनाकर और जाँच कर इसका परीक्षण कर सकते हैं Project -> Properties -> Build tab -> Platform target... लेकिन ध्यान दें कि AnyCPU-32bitPreferredकेवल .Net संस्करण 4.5 और उच्चतर में उपलब्ध है। क्यों डिफ़ॉल्ट है कि AnyCPU
युषा अलायूब

कुछ मामलों में खान को बाहर निकाला गया; मैं बस उम्मीद कर रहा था कि वहाँ क्या हो रहा है पर कुछ प्रलेखन .net 4.5+ या .net मानक / कोर (या वास्तव में, MSBuild 16)
Ran Sagy

-1

कारण यह है: यदि आप 64 बिट एप्लिकेशंस के साथ अधिक मेमोरी का उपयोग नहीं करना चाहते हैं। जिसका अर्थ है, यदि आपका एप्लिकेशन AnyCPU है , तो आप 32 बिट के रूप में चलाना चाहते हैं।

अधिक जोड़ने के लिए, Visual Studio में सेटिंग विशेष CLR को लक्षित करता है:

विज़ुअल स्टूडियो एक x86 कंप्यूटर पर सीएलआर के 32-बिट संस्करण को स्थापित करता है, और 32-बिट संस्करण और 64-बिट विंडोज कंप्यूटर पर सीएलआर के उचित 64-बिट संस्करण को स्थापित करता है। (क्योंकि विजुअल स्टूडियो एक 32-बिट एप्लिकेशन है, जब यह 64-बिट सिस्टम पर स्थापित होता है, तो यह WOW64 के तहत चलता है।)

कृपया 64-बिट एप्लिकेशन ( MSDN ) लेख देखें ।


1
मुझे यकीन नहीं है कि यह सटीक है। जैसा कि, यह मेरी समझ है कि 32 या 64 की परवाह किए बिना .NET निष्पादक अभी भी प्रति प्रक्रिया 2 जीबी के आसपास सीमित हैं।
जेपी रिचर्डसन

1
मेरे उत्तर का संपादन किया। लेकिन यकीन नहीं है कि अगर यह आप के लिए देख रहे हैं :)
पेरू

2
@Aaron, संकलक अनिवार्य रूप से यह तय करने के लिए रनटाइम के लिए ध्वज सेट करता है कि क्या विधानसभा लोड करना ठीक है (यानी x64 प्रक्रिया में लोड होने के लिए x86- केवल असेंबली को ब्लॉक करें) और झंडे के आधार पर प्रक्रिया (नए EXE के लिए) कैसे शुरू करें। मेरा मानना ​​है कि आईएल दोनों फ्लेवर के लिए समान है।
अलेक्सी लेवेनकोव

1
@JPRichardson हाँ आप सही हैं। लेकिन .net 4.5 में आपके पास आकार बढ़ाने का विकल्प है।
पेरू

40
@JPRichardson, न तो 32 और न ही 64 बिट .net निष्पादन योग्य 2GB प्रति प्रक्रिया तक सीमित - सबसे पहले प्रति-प्रक्रिया पता स्थान OS स्तर प्रतिबंध (32 बिट प्रक्रिया के लिए 2/3 + GB और 64 बिट के लिए बहुत अधिक), दूसरा 32 बिट संस्करण हो सकता है 2GB से अधिक का उपयोग करें यदि "लार्जएड्रेसवेयर" झंडा निष्पादन योग्य पर सेट है। केवल 2GB प्रतिबंध मुझे पता है कि सरणी / आवंटन आकार के बारे में है जो Int32 श्रेणी (लगभग 2GB) द्वारा सीमित हैं।
अलेक्सई लेवेनकोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.