2012-10-08 9 views
14

वीएस2012 (और पिछले संस्करण ...) में, आप प्रोजेक्ट बनाने के दौरान लक्ष्य प्लेटफॉर्म निर्दिष्ट कर सकते हैं। मेरी समझ, हालांकि, सी # को सीआईएल को "संकलित" हो जाता है और फिर होस्ट सिस्टम पर चलते समय जेआईटी संकलित किया जाता है।सी # अनुप्रयोग संकलन करते समय मंच को सेट करना कोई फर्क पड़ता है?

क्या इसका मतलब यह है कि केवल लक्ष्य प्लेटफ़ॉर्म निर्दिष्ट करने के कारण जानबूझकर उपयोगकर्ताओं को कुछ आर्किटेक्चर पर सॉफ़्टवेयर चलाने से रोकते हैं या एप्लिकेशन को 64 बिट मशीन पर 32 बिट के रूप में चलाने के लिए मजबूर करना पड़ता है? मैं नहीं देख सकता कि यह अनुकूलन के साथ करना होगा, जैसा कि मुझे लगता है कि सीआईएल -> मूल चरण में होता है, जो होस्ट आर्किटेक्चर पर जस्ट-इन-टाइम होता है?

This MS Link किसी भी वैकल्पिक स्पष्टीकरण की प्रतीत नहीं होता है और मुझे इस तथ्य का कोई सुझाव नहीं मिल रहा है कि उदाहरण के लिए, आपको उसी एप्लिकेशन के अलग 32/64 बिट संस्करणों को रिलीज़ करना चाहिए - यह तार्किक प्रतीत होता है कि " anycpu "को भी ठीक से चलाना चाहिए और फिर, अनुकूलन जेआईटी चरण में लागू किया जाएगा।

+0

मुझे नहीं पता कि यह VS2012 में बदल गया है, लेकिन "संपादन और जारी रखें" सुविधा VS2010 के तहत 64 बिट मोड में ऐप्स डिबग करने के दौरान काम नहीं करती है। – David

+0

@ डेविस: यह नहीं है। (लेकिन अब आप विधि निकायों को संपादित करने के लिए ई एंड सी का उपयोग कर सकते हैं जिसमें अज्ञात विधि या लैम्बडा शामिल हैं, वास्तविक विवरणों को कम करें जहां वे दिखाई देते हैं) –

उत्तर

16

क्या इसका मतलब यह है कि लक्षित प्लेटफ़ॉर्म निर्दिष्ट करने का एकमात्र कारण जानबूझकर उपयोगकर्ताओं को कुछ आर्किटेक्चर पर सॉफ़्टवेयर चलाने से रोकना है या एप्लिकेशन को 64 बिट मशीन पर 32 बिट के रूप में चलाने के लिए मजबूर करना है?

हां, और यह महत्वपूर्ण है यदि आप अपने प्रबंधित कोड के साथ मिश्रित देशी कोड का उपयोग कर रहे हैं। हालांकि, रनटाइम पर अनुकूलित होने पर यह नहीं बदलेगा।

यदि आपका कोड 100% प्रबंधित है, तो कोई भीCPU (या नया एएनसीपीयू 32-बिट पसंद करता है) ठीक है। कंपाइलर अनुकूलन समान होंगे, और जेआईटी वर्तमान निष्पादन प्लेटफ़ॉर्म के आधार पर रनटाइम पर अनुकूलित होगा।

मैं जब तक आप प्रदर्शन कर रहे हैं तथ्य यह है कि आप करना चाहिए, उदाहरण के लिए, एक ही आवेदन

के अलग-अलग 32/64 बिट संस्करण जारी ऐसा करने का कोई कारण नहीं है का कोई सुझाव प्राप्त कर सकते हैं गैर-प्रबंधित कोड के साथ इंटरऑप, इस मामले में, जिसमें अलग 32 और 64 बिट डीएलएल की आवश्यकता होगी।

+0

क्या पी/आमंत्रण या "असुरक्षित" सामान इस सेटिंग पर निर्भर करते हैं? (मुझे लगता है कि उनको 100% प्रबंधित नहीं माना जा सकता है ..) –

+0

@pst पी/Invoke मूल के खिलाफ जा रहा है, इसलिए यह महत्वपूर्ण है (जब तक कि आपके पास रनटाइम पर कुछ रास्ता न हो, यह सुनिश्चित करने के लिए कि आप केवल सही प्लेटफ़ॉर्म डीएलएल को मार रहे हैं), लेकिन यह अनुकूलन समस्या नहीं है - यह एक शुद्धता है मुद्दा। –

+1

@pst - हां। चूंकि इस प्लेटफार्म ध्वज को सेट करना (अगर रनटाइम शुरू करने के लिए जिम्मेदार एंट्री निष्पादन योग्य पर उपयोग किया जाता है) परिणामस्वरूप कोड को 32 या 64 बिट मेमोरी स्पेस में लोड किया जाएगा। यदि आपका पी/आवेषण पॉइंटर्स और अन्य मेमोरी विशिष्ट प्रकारों को 32-बिट आयामों की अपेक्षा करने के लिए लिखा गया है, और यह 64-बिट रनटाइम (या इसके विपरीत) में लोड हो जाता है तो चीजें असफल हो जाएंगी। – Adam

12

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

इस वजह से - ध्वज ज्यादातर तभी होगा जब यह एक EXE फ़ाइल पर सेट हो - और डीएलएल पर सेट होने पर कोई प्रभाव नहीं पड़ता। उदाहरण के लिए - यदि आपके पास '32 -bit-flagged .NET DLL 'है जिसका उपयोग 64-बिट-फ़्लैग किए गए .NET EXE या किसी भी-cpu- ध्वजांकित .NET EXE द्वारा किया जाता है, और आप EXE चालू करते हैं एक 64-बिट मशीन - तो लोडर 64-बिट रनटाइम शुरू करेगा। जब 32-बिट डीएलएल लोड करने का समय आता है, तो बहुत देर हो चुकी है - 64-बिट रनटाइम पहले से ही चुना जा चुका है, इसलिए आपका प्रोग्राम असफल हो जाएगा (मुझे विश्वास है कि यह एक BadImageFormatException है जिसे आप प्राप्त करेंगे)।

+0

+1 रीड के जवाब के लिए बहुत अच्छा पूरक है। और हाँ, आप 'BadImageFormatException' त्रुटि के बारे में सही हैं। – Icarus

संबंधित मुद्दे