विज़ुअल स्टूडियो "किसी भी सीपीयू" लक्ष्य का क्या मतलब है?


494

मुझे Visual Studio 2008 में .NET प्लेटफ़ॉर्म बिल्ड विकल्पों से संबंधित कुछ भ्रम है।

"कोई भी सीपीयू" संकलन लक्ष्य क्या है, और यह किस प्रकार की फाइलें उत्पन्न करता है? मैंने इस "किसी भी सीपीयू" के आउटपुट निष्पादन योग्य की जांच की और पाया कि वे x86 निष्पादन योग्य हैं (जो यह नहीं देख सकते हैं!)। तो, क्या x86 बनाम "कोई भी CPU" के लिए निष्पादन योग्य लक्ष्यीकरण में कोई अंतर है?

एक और बात जिस पर मैंने गौर किया, वह यह है कि प्रबंधित C ++ प्रोजेक्ट्स में विकल्प के रूप में यह प्लेटफॉर्म नहीं है। ऐसा क्यों है? इसका मतलब यह है कि "किसी भी सीपीयू" निष्पादन योग्य के बारे में मेरा संदेह 32-बिट वाले सादे हैं?


4
प्लेटफ़ॉर्म लक्ष्य का उपयोग करने का निर्णय लेते समय एक और बात पर विचार करें: यदि स्टार्टअप प्रोजेक्ट का लक्ष्य है Any CPUऔर आप 64 बिट OS पर चल रहे हैं, तो आप डीबगिंग करते समय संपादित करने और जारी रखने की क्षमता खो देते हैं । (आप 64 बिट प्रक्रिया को प्रभावी ढंग से डिबग कर रहे हैं)। आप डीबगिंग के दौरान इसे रोकने के लिए स्टार्टअप प्रोजेक्ट लक्ष्य बना सकते हैं x86। (स्टार्टअप परियोजना से संदर्भित विधानसभाओं को लक्षित करना जारी रह सकता है Any CPU
क्रिस्टियन डायकोन्सकु

8
VS2013 के साथ @CristiDiaconescu संपादित करें और जारी रखें अब संभव है
ms007

मुझे लगता है कि इस बारे में कुछ नोट होना चाहिए कि क्या यह परियोजना एक अनुप्रयोग है या एक क्लास लाइब्रेरी है क्योंकि बाद के लिए लक्ष्य बिटनेस सेट करना प्लेटफॉर्म के आधार पर उपभोग करने वाले अनुप्रयोगों के लिए इसकी उपलब्धता को प्रभावित कर सकता है। मैं एक x86पुस्तकालय में एक AnyCPUआवेदन द्वारा भस्म होने के साथ भाग गया, जहां मुझे Prefer 32-bitलोड त्रुटि से बचने के लिए सेट करना था ।
स्टीविन्क

जवाबों:


384

एक AnyCPU विधानसभा 64-बिट प्रक्रिया में लोड होने पर 64-बिट कोड और 32-बिट प्रक्रिया में लोड होने पर 32 बिट होगा।

सीपीयू को सीमित करके आप कह रहे हैं: असेंबली द्वारा उपयोग किया जा रहा कुछ (कुछ अनवांटेड) है जिसमें 32 बिट्स या 64 बिट्स की आवश्यकता होती है।


3
इसलिए, मैं विधानसभा का उत्पादन कैसे करूंगा जो कि C ++ में x64 तक होगा?
प्रात

50
C ++ प्रोजेक्ट्स मूल कोड के लिए संकलित हैं, इसलिए JIT कंपाइलर शामिल नहीं है ... इस प्रकार, आप वह नहीं कर सकते जो आप पूछ रहे हैं।
cplotts 25'10

7
@cplotts: चूंकि @galets ने यह सवाल 3 महीने पहले पूछा था कि इसकी संभावना नहीं है कि वह आपका जवाब देखेगा। आपकी टिप्पणी में @galets उपसर्ग का उपयोग करें कि मैं यहां कैसे हूं ताकि वह आपके उत्तर के बारे में सतर्क हो जाए।
एंथनीवजोन

4
@AnthonyWJones सामान्य रूप से आप सही हैं, सिवाय इसके कि उपयोगकर्ता इस सवाल का ओपी है, इस मामले में, जैसा कि वे सभी टिप्पणियों के बारे में सूचित करेंगे।
मार्क हर्ड

12
@मार्कहुड दरअसल, इस मामले में, ओपी को सूचित नहीं किया जाएगा। जब तक वे विशेष रूप से @ सिंटैक्स के साथ पिंग नहीं होते हैं, तब तक ओपी को उत्तरों के लिए टिप्पणियों की सूचना नहीं मिलती है । ओपी के स्वतः ही उनके मूल प्रश्न में जोड़े गए टिप्पणियों को अधिसूचित कर दिया जाता है।
RSW

320

मुझे लगता है कि अधिकांश महत्वपूर्ण सामान कहा गया है, लेकिन मैंने अभी सोचा था कि मैं एक चीज जोड़ूंगा: यदि आप किसी भी सीपीयू के रूप में संकलित करते हैं और एक x64 प्लेटफॉर्म पर चलते हैं, तो आप 32-बिट डीएलएल फ़ाइलों को लोड करने में सक्षम नहीं होंगे, क्योंकि आपका आवेदन WoW64 में शुरू नहीं हुआ था , लेकिन उन DLL फ़ाइलों को वहाँ चलाने की आवश्यकता है।

यदि आप x86 के रूप में संकलित करते हैं, तो x64 सिस्टम आपके आवेदन को WoW64 में चलाएगा, और आप 32-बिट DLL फ़ाइलों को लोड करने में सक्षम होंगे।

इसलिए मुझे लगता है कि आपको "किसी भी सीपीयू" का चयन करना चाहिए यदि आपकी निर्भरता या तो पर्यावरण में चल सकती है, लेकिन 32-बिट निर्भरता होने पर x86 चुनें। Microsoft का यह लेख इसे थोड़ा समझाता है:

/ CLRIMAGETYPE (CLR छवि का प्रकार निर्दिष्ट करें)

संयोग से, यह अन्य Microsoft प्रलेखन सहमत है कि x86 आमतौर पर एक अधिक पोर्टेबल विकल्प है:

X86 चुनना आमतौर पर ऐप पैकेज के लिए सबसे सुरक्षित कॉन्फ़िगरेशन है क्योंकि यह लगभग हर डिवाइस पर चलेगा। कुछ उपकरणों पर, x86 कॉन्फ़िगरेशन वाला ऐप पैकेज नहीं चलेगा, जैसे कि Xbox या कुछ IoT कोर डिवाइस। हालांकि, एक पीसी के लिए, एक x86 पैकेज सबसे सुरक्षित विकल्प है और डिवाइस परिनियोजन के लिए सबसे बड़ी पहुंच है। विंडोज 10 उपकरणों का एक बड़ा हिस्सा विंडोज के x86 संस्करण को चलाना जारी रखता है।


2
शायद आप अपने उत्तर को यह कहने के लिए संपादित कर सकते हैं कि कोई यह कैसे निर्धारित कर सकता है कि दिया गया डीएलएल केवल 32-बिट है। जहाँ तक मुझे पता है, यह पता लगाना चाहिए। मुझे लगता है कि हम DLL के लिए उम्मीद कर रहे हैं जो केवल "x86" के बजाय "कोई भी CPU" है।
डैन डब्ल्यू

+1 एक महत्वपूर्ण अंतर। एक 32 बिट निर्भरता (जो इस तरह की पहचान नहीं की गई थी) का उपयोग करना आवश्यक था। गुप्त रनटाइम त्रुटि संदेशों का पता नहीं लगा सका। एक कूबड़ पर सीपीयू लक्ष्य को बदल दिया और यह काम कर गया लेकिन "क्यों" की खोज में चला गया। किसी दिन अच्छा होगा जब सब कुछ 64 बिट का हो और असंगति के मुद्दे 16bit बनाम 32bit की तरह विचित्र प्रतीत होंगे।
गेराल्ड डेविस

2
@ गेराल्डवीस - मैं सहमत हूँ। विडंबना यह है कि 32-बिट और 64-बिट निर्भरता (सिर्फ सीएलआर में थंकिंग परत की कमी) का मिश्रण नहीं होने के लिए कोई तकनीकी कारण नहीं है और मुझे बिट के देखे जाने पर .NET के शुरुआती दिनों में निराशा हुई। नेस को अभी भी कुछ विचार करना था जब तैनात करना (यह एक वीएम / जेआईटी है, यह थोड़ा और अधिक जोड़ा प्रदान करने का अवसर होगा)।
कोडेनहेम

1
@mrjoltcola: इससे भी बदतर यह है कि जिस तरह से Microsoft ने निर्णय लिया है कि मैं थाह नहीं कर सकता कि रजिस्ट्री प्रविष्टियों को 32-बिट और 64-बिट ब्रह्मांड में विभाजित किया जाना चाहिए, भले ही वे स्क्रीन रंग, डिफ़ॉल्ट सेटिंग्स आदि जैसी चीजों को नियंत्रित करते हों।
सुपरकैट

यह वह उत्तर है जिसकी मुझे तलाश थी ... धन्यवाद!
मुनीम सॉफ्टवेयर

51

यहां एक त्वरित अवलोकन है जो विभिन्न बिल्ड लक्ष्यों को बताता है।

यदि आप x86 और x64 दोनों प्लेटफ़ॉर्म पर चलेंगे, और आपके पास कोई विशिष्ट x64 ऑप्टिमाइज़ेशन नहीं है, तो मैं अपने अनुभव से, आप विशेष रूप से "x86" कहने के लिए बिल्ड को बदल दूंगा।

इसका कारण कभी-कभी आपको कुछ DLL फाइलें मिल सकती हैं जो टकराती हैं या कुछ कोड जो X64 वातावरण में वाह वाह क्रैश कर देते हैं। X86 को विशेष रूप से निर्दिष्ट करके, x64 OS अनुप्रयोग को शुद्ध x86 अनुप्रयोग के रूप में मानेगा और सुनिश्चित करेगा कि सब कुछ सुचारू रूप से चलता रहे।


37
जो भयानक हो सकता है यदि आपका सर्वर सर्वर वातावरण के लिए लेखन और चाहता है कि आपका एप्लिकेशन अधिक 2GB मेमोरी का उपयोग करने में सक्षम हो। आप किसी भी x64 JIT अनुकूलन से बाहर निकल रहे हैं जो किसी दिन पाइप से नीचे आ सकता है।
ऑस्टिन हैरिस

AnyCPU संकलनों के साथ मेरे पास जितने भी रनटाइम मुद्दे हैं, सभी का औचित्य है कि मुझे इसे एक बिल्ड विकल्प के रूप में उपयोग करने से रोकने की आवश्यकता है जब तक कि किसी ने स्पष्ट रूप से दोनों पर काम करने वाले बायनेरिज़ से अनुरोध नहीं किया है। मैंने 10 वर्षों में किसी के लिए x64 से अधिक x86 बायनेरिज़ का अनुरोध नहीं किया है।
kayleeFrye_onDeck

2
"विशेष रूप से x86 निर्दिष्ट करके, x64 OS ऐप को एक शुद्ध x86 ऐप के रूप में मानेगा और सुनिश्चित करेगा कि सब कुछ आसानी से चलता रहे।" - क्षमा करें, मैं असहमत हूं। x64 OS अभी भी आपके x86 ऐप को WOW64
मंदीप जंजुआ

यह किसी को बुरी सलाह है जो इसके प्रभाव को पूरी तरह से समझ नहीं पाता है। @AustinHarris एक शानदार उदाहरण देता है। एक वेब वर्कर प्रक्रिया की कल्पना करें जो केवल कुछ जीबी रैम तक ही सीमित है (मुझे हाल ही में इसके उत्पादन से निपटना पड़ा था)।
rgoliveira

47

लेख देखें Visual Studio .NET प्लेटफ़ॉर्म लक्ष्य समझाया

डिफ़ॉल्ट सेटिंग, "कोई भी सीपीयू", का अर्थ है कि असेंबली सीपीयू पर मूल रूप से चलेगी जो वर्तमान में चल रही है। मतलब, यह 64-बिट मशीन के रूप में 64-बिट और 32-बिट मशीन पर 32-बिट के रूप में चलेगा। यदि विधानसभा को 64-बिट अनुप्रयोग से कहा जाता है, तो यह 64-बिट असेंबली और इतने पर प्रदर्शन करेगा।

उपरोक्त लिंक के टूटने की सूचना दी गई है, इसलिए यहां इसी तरह के स्पष्टीकरण के साथ एक और लेख दिया गया है: What AnyCPU वास्तव में इसका अर्थ .NET 4.5 और विजुअल स्टूडियो 11 है


1
लिंक टूट गया - अब एक पार्क किए गए डोमेन पर जा रहा है।
जॉन एडम्स

मैंने इसी तरह की जानकारी के साथ एक दूसरे लेख का लिंक जोड़ा। मैंने पहले लिंक को छोड़ दिया है कि डोमेन कभी सक्रिय होता है।
डीसीएनवाईएएम


39

"कोई भी सीपीयू" का मतलब है कि जब प्रोग्राम शुरू किया जाता है, तो ओएस बिटनेस के आधार पर .NET फ्रेमवर्क का पता चलेगा, चाहे आपका प्रोग्राम 32 बिट या 64 बिट में चला जाए।

X86 और Any CPU में अंतर है : x64 सिस्टम पर, X86 के लिए संकलित आपका निष्पादन योग्य 32-बिट निष्पादन योग्य के रूप में चलेगा।

जहां तक ​​आपका संदेह है, बस विजुअल स्टूडियो 2008 कमांड लाइन पर जाएं और निम्नलिखित रन करें।

dumpbin YourProgram.exe /headers

यह आपको आपके कार्यक्रम की कड़वाहट, प्लस एक पूरी बहुत कुछ बताएगा।


7
यदि इसे "किसी भी सीपीयू" में बनाया गया है, तो यह डंपबिन हेडर में 32 बिट के रूप में दिखाई देगा।
किर्बिनेटर

34

किसी भी CPU का मतलब है कि यह किसी भी प्लेटफॉर्म पर काम करेगा। ऐसा इसलिए है क्योंकि प्रबंधित कोड जावा के समान है। इसे एक बाइट कोड के रूप में संकलित करने के बारे में सोचो जो .NET फ्रेमवर्क द्वारा रन-टाइम में व्याख्या की गई है।

C ++ में यह विकल्प नहीं है क्योंकि यह मशीन कोड के लिए संकलित है जो प्लेटफ़ॉर्म विशिष्ट है।


12
प्रश्न के एक भाग का उत्तर देने के लिए +1 जो किसी और ने नहीं किया (C ++ परियोजनाओं के बारे में AnyCPU एक विकल्प के रूप में नहीं है)।
cplotts

C ++ / CLI को बिना किसी मशीन कोड (/ clr: pure) के IL कोड में संकलित किया जा सकता है। लेकिन आकार (शून्य *) को अभी भी C ++ में एक संकलन-समय स्थिर रहने की आवश्यकता है; इसलिए जब कोई मशीन कोड शामिल नहीं है, तब भी आप एक बाइनरी नहीं बना सकते जो एक ही समय में 32-बिट और 64-बिट पर काम करेगा।
डैनियल

5

मैं इस पोस्ट को पढ़ने की सलाह देता हूं ।

AnyCPU का उपयोग करते समय , शब्दार्थ निम्नलिखित हैं:

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

8
केवल अगर "32-बिट को प्राथमिकता दें" चुना जाता है।
फ्लोरियन विंटर

विजुअल स्टूडियो 11 के बाद से डिफ़ॉल्ट कौन सा है
Moerwald

@ मुझे विश्वास है कि यह एक बग था जिसे ठीक कर दिया गया है। यदि आप पढ़ते हैं कि पोस्ट मैमकास संदर्भ देता है, तो लेखक "वर्तमान दृश्य स्टूडियो यूआई में" 32-बिट को प्राथमिकता दें "को धूसर और अनियंत्रित करता है, जहां वास्तविकता में यह सक्षम है ..."; वीएस (15.8.0) के मेरे संस्करण में विकल्प अभी भी बाहर निकाला गया है और अनियंत्रित है, हालांकि, यह उम्मीद के अनुसार काम करता है (संकलित विधानसभा के कॉर्फ़्लैग्स अनुभाग में फ्लैग 32BITPREF = FALSE)
रिकाॅर्ड अमारो

-1

यह मैंने इसे विज़ुअल स्टूडियो 2017 में कैसे किया:

  • सॉल्यूशन एक्सप्लोरर में
  • अपने प्रोजेक्ट पर राइट-क्लिक करें
  • "गुण" पर क्लिक करें
  • "बिल्ड" पर क्लिक करें
  • "32-बिट को प्राथमिकता दें" विकल्प बंद करें
  • और आप प्लेटफ़ॉर्म लक्ष्य से "x64" चुन सकते हैं।

यह उत्तर ऑफ टॉपिक है।
जोनास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.