2010-12-06 10 views
31

ग्रीटिंग्स,ढांचे को लक्षित करने का वास्तव में क्या अर्थ है, और मैं संगतता को अधिकतम कैसे कर सकता हूं?

इससे पहले मुझे पहली बार उलझन में आया क्योंकि मैंने पहली बार सी # में कोडिंग शुरू कर दी थी। मेरा लक्ष्य एक ऐसी असेंबली बनाना है जो उपयोगकर्ता के पास हाल ही में .NET ढांचे पर चलता है, जो भी हो सकता है। मैं स्थापित करने के लिए .NET 4 की आवश्यकता नहीं चाहता हूं, लेकिन यदि उपयोगकर्ता के पास यह है, तो मैं इसका उपयोग करना चाहता हूं, और सबसे महत्वपूर्ण बात यह है कि, यदि उपयोगकर्ता केवल .NET 4 और नीचे कुछ भी नहीं है, तो मैं इसे अभी भी काम करना चाहता हूं। मुझे संदेह है कि यह भी संभव नहीं है।

मैं वास्तव में समझ नहीं पा रहा हूं कि जब मैं विजुअल स्टूडियो में "लक्ष्य फ्रेमवर्क" बदलता हूं तो मैं क्या चुन रहा हूं। क्या इसका मतलब है "इस संस्करण और ऊपर के साथ संगत होगा"? या "केवल इस संस्करण के साथ संगत होगा"? ऐसा लगता है कि यह बाद वाला है; वर्चुअल मशीनों में मेरे परीक्षण दिखाते हैं .NET 4 लक्षित असेंबली .NET 4 के बिना विफल हो रही हैं, और .NET 3.5 लक्षित असेंबली .NET 3.5 के बिना विफल हो रही हैं। क्या इसे सेट करने का कोई तरीका नहीं है इसलिए मैं अधिकतम संगतता प्राप्त कर सकता हूं?

अद्यतन: स्पष्टीकरण के लिए, मेरे पास एक प्रोग्राम है जो .NET 2. को लक्षित करता है। यहां पोस्टर यह इंगित करते हैं कि इसे .NET 4 के साथ लोड करना चाहिए। लेकिन केवल .NET 4 के साथ वातावरण में और इससे पहले कुछ भी नहीं, यह विफल हो जाता है लोड करने के लिए।

अद्यतन 2: ठीक है, इसे समझ लिया गया है, लेकिन यहां पोस्टर की तुलना में यह कहीं अधिक जटिल है। मैं जटिलताओं पर चर्चा करने के लिए एक अलग सवाल खोल रहा हूं, लेकिन लघु संस्करण है, यदि आप .NET 4 पर non-.NET 4 असेंबली चलाने के लिए चाहते हैं तो आपको <supportedRuntime version="v4.0" /> के साथ एक app.config की आवश्यकता है। वे बिना लोड किए जाएंगे यह।

+1

क्या मैं पूछ सकता हूं कि आप क्या लिखने की कोशिश कर रहे हैं कि आप इसे नवीनतम ढांचे का उपयोग करना चाहते हैं? ज्यादातर परिदृश्यों में, संभवतः जल्द से जल्द ढांचे में एक आवेदन लिखने के साथ चिपकाना स्वीकार्य है, अन्यथा आप विशिष्ट ढांचे के खिलाफ संकलन करने और स्थापित संस्करणों के आधार पर मिश्रण-और-मैच गेम खेलने की कोशिश कर रहे हैं। –

+1

ऐसा नहीं है कि मैं वास्तव में नवीनतम ढांचे का उपयोग करना चाहता हूं, यह है कि मैं उन उपयोगकर्ताओं को चाहता हूं जिनके पास केवल .NET 4 स्थापित है, जिन्हें * gargantuan * .NET 3.5 ढांचे को डाउनलोड और इंस्टॉल करने की आवश्यकता नहीं है। –

उत्तर

17

चौखटे पीछे की ओर-संगत होने के लिए कर रहे हैं के रूप में नेट की नई सुविधाओं से ढीला हो सकता है; यदि आप एक कार्यक्रम .NET 2.0 में लिखा है, तो आप 4.0 क्रम में यह दिखाया जा सकता क्योंकि चौखटे में से कोई भी कभी कार्यक्षमता कि पिछले संस्करण के लिए किया था (जो कारण है कि हम अभी भी ArrayList जैसी गैर-सामान्य संग्रह निकालने के लिए, भले ही वे जेनेरिक संग्रह के पक्ष में बहिष्कृत हैं)। हालांकि, रिवर्स जरूरी नहीं है; एक 4.0 ऐप 2.0 में चलाने की गारंटी नहीं है, क्योंकि यह नए रनटाइम की नई सुविधाओं का लाभ उठा सकता है जो पूर्व संस्करणों में उपलब्ध नहीं हैं।किसी भी मामले में, यदि आप चाहते हैं कि आपका ऐप रनटाइम संस्करणों पर चलाने का प्रयास करे, तो यह विशेष रूप से लक्षित नहीं होता है, तो आपको supportedRuntime तत्वों का उपयोग करके app.config में निर्दिष्ट करना होगा।

अपने विशिष्ट सवाल का जवाब करने के लिए, तुम क्या आप निम्न बुनियादी प्रक्रिया के साथ चाहते हैं कर सकते हैं:

  • EARLIEST ढांचा संस्करण है कि आप का समर्थन करना चाहते लक्षित करने के लिए अपने अनुप्रयोग का विकास करना। यह नए रनटाइम्स (जैसे कि 3.5 में लिंक, और 4.0 में गतिशील टाइपिंग) की नई सुविधाओं तक पहुंच को अक्षम कर देगा, यह सुनिश्चित करने के लिए कि आपके ऐप को किसी भी सुविधा की आवश्यकता नहीं होगी जिसे किसी भी समर्थित रनटाइम द्वारा प्रदान नहीं किया जा सकता है।

  • अपनी ऐप.कॉन्फिग फ़ाइल में SupportedRuntime तत्व का उपयोग कर अपने एप्लिकेशन को स्वीकार्य रूपरेखा निर्दिष्ट करें। यह उस देशी कोड को बताएगा जो रनटाइम को प्रारंभ करता है जिसमें आपका ऐप चलाएगा यदि उसे लक्षित संस्करण नहीं मिल रहा है, तो कोई भी स्वीकार्य है। मेरा मानना ​​है कि व्यवहार पहले लक्षित ढांचे की तलाश करना है, और यदि उपलब्ध नहीं है तो इसे नवीनतम समर्थित रनटाइम का उपयोग करना चाहिए।

0

I मानते हैं यह आपके द्वारा चुने गए संस्करण और ऊपर के संस्करण के रूप में माना जाता है। इसलिए यदि आप 2.0 ढांचे को लक्षित करते हैं, तो क्लाइंट 2.0, 3.0, 3.5, या 4.0 फ्रेमवर्क स्थापित होने पर इसे काम करना चाहिए।

आप इसे चुनते समय भाषा सुविधाओं का भी चयन कर रहे हैं, इसलिए मुझे कोई तरीका नहीं है कि आप एक एप्लिकेशन लक्ष्यीकरण 2.0 ढांचे का उपयोग कर 4.0 फ्रेमवर्क सुविधाओं का उपयोग करने में सक्षम होंगे। यहां तक ​​कि गतिशील रूप से असेंबली लोड करना भी काम नहीं करता है, 2.0 अनुप्रयोग से 4.0 तक संकलित एक डीएल लोड करने का प्रयास करें, यह आपको नहीं देगा।

1

.NET पिछड़ा-संगत है, इसका मतलब है कि यदि आप लक्ष्य फ्रेमवर्क के रूप में .NET Framework 2.0 का चयन करते हैं, तो यह स्थापित संस्करण 2.0, 3.0, 3.5 और 4.0 पर चलाएगा। लेकिन यदि आप लक्ष्य फ्रेमवर्क के रूप में संस्करण संस्करण 4.0 का चयन करते हैं, तो यह केवल तभी चलाएगा यदि आपके पास संस्करण 4.0 स्थापित है।

+8

यही मैंने माना है, लेकिन ऐसा लगता है कि यह मामला नहीं है। मैंने वर्चुअल मशीन में केवल मेरे .NET 4 स्थापित किए गए एप्लिकेशन (जो एक एक्सटेंशन डीएलएल है) का परीक्षण किया है, और यह लोड नहीं होता है। अगर मैं इसका उपयोग करने की कोशिश करता हूं तो 'ngen' मुझे निम्न त्रुटि देता है:' रनटाइम लोड करने में विफल। (HRESULT से अपवाद: 0x80131700)। असेंबली {मेरी असेंबली} को चलाने के लिए रनटाइम के संस्करण v2.0.50727 की आवश्यकता होती है। –

+0

https://stackoverflow.com/a/2455686/1128762 देखें – Graham

0

यहां बताया गया है कि लक्ष्यीकरण कैसे काम करता है: यदि आप .NET 3.5 को लक्षित करते हैं, तो यदि उपयोगकर्ता के पास .NET 3.5 नहीं है तो यह नहीं चलेगा। यदि उपयोगकर्ता का कोई उच्च संस्करण है तो यह चलाएगा।

अधिकतम संगतता के लिए, .NET 2.0 चुनें, यह .NET 3.5, 4.0 और इसी तरह से भी चलाएगा।

हालांकि, अगर आप इस तरह के LINQ आदि

http://msdn.microsoft.com/en-us/library/bb398197(VS.100).aspx

Can I still target .NET Framework 2.0 in VisualStudio 2010?

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

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