2010-05-05 20 views
6

मेरे पास एक डीएल है जो .NET 3.5 पर आधारित है - यह आंतरिक रूप से लिंक के लिए उपयोग करता है, लेकिन खुला एपीआई सरल है, कोई फैंसी सामान नहीं है। चूंकि सी # जेनेरिक संकलन समय पर हल हो जाते हैं, मुझे लगता है कि पार्टी को कॉल करने के लिए यह सभी एपीआई (सभी सार्वजनिक भागों) की गणना करता है।.Net3.5 dll को .Net2.0 प्रोजेक्ट में कैसे जोड़ें?

हालांकि जब मैं net2.0 प्रोजेक्ट से इस डीएलएल का उपयोग करने का प्रयास करता हूं तो मुझे जानकारी मिलती है, कि डीएलएल को संदर्भित नहीं किया जा सकता है क्योंकि डीएल या इसकी निर्भरताओं में से एक को नेट फ्रेमवर्क के बाद के संस्करण की आवश्यकता होती है।

मैं लक्ष्य कंप्यूटर पर किसी भी .net संस्करण को स्थापित कर सकता हूं (जब पूरा ऐप इंस्टॉल हो), लेकिन मैं प्रोजेक्ट के लिए .NET संस्करण नहीं बदल सकता।

तो: इसे कैसे हल करें? इस परियोजना में सी डीएल जोड़ते समय मुझे ऐसी कोई समस्या नहीं थी, इसलिए सी # डीएल स्वयं निहित हैं या नहीं?

उत्तर

9

सी # डीएलएस को .NET रनटाइम चलाने की आवश्यकता है क्योंकि उन्हें मशीन कोड में संकलित नहीं किया गया है। इस मामले में डीएलएल का कहना है कि इसे नेट 3.5 की आवश्यकता है ताकि आपकी सभी परियोजनाओं को 3.5 या उच्चतर का उपयोग करना पड़े।

अपनी परियोजना को नेट 2.0 के रूप में रखने के लिए आपको 3.5 डीएलएल रखने और अलग प्रक्रियाओं में संवाद करने के लिए एक और निष्पादन योग्य बनाने की आवश्यकता होगी।

सी डीएलएल काम करता है क्योंकि इसे देशी कोड में संकलित किया गया है और नेट फ्रेमवर्क की आवश्यकता नहीं है। (या कम से कम नहीं संस्करण 2.0 की तुलना में अधिक)

+0

+1, अच्छा जवाब। साथ ही, मुझे लगता है कि आपका मतलब 3.5 डीएलएल (3.2 नहीं) – Pretzel

+0

जैसा कि मैंने कहा था, मैं 3.5 स्थापित कर सकता हूं, कोई समस्या नहीं है, लेकिन मैं परियोजना के लिए 3.5 सेट नहीं कर सकता, क्योंकि कोई दुर्घटना से 3.5 सुविधाओं का उपयोग कर सकता है। – greenoldman

+0

हां मैंने अभी तय किया है - धन्यवाद @ प्रेट्ज़ेल – Mark

2

आप वस्तुओं के लिए LINQ का उपयोग कर रहे हैं, तो आप Linq ब्रिज का उपयोग कर सकते हैं: http://www.albahari.com/nutshell/linqbridge.aspx

इस .net 2.0 के लिए एक Linq वस्तुओं के लिए कार्यान्वयन है।

आपको अभी भी बनाम 2008 का उपयोग करके संकलन करना होगा, लेकिन आप उस मामले में लक्ष्य प्लेटफ़ॉर्म के रूप में .net 2.0 के साथ संकलित कर सकते हैं। (ऐसा इसलिए है क्योंकि सी # 3 कंपाइलर लिनक क्लॉज को समझता है, भले ही आप .NET 2.0 को लक्षित करते हैं, यह इस मामले में .NET 3.5 लाइब्रेरीज़ के बजाय लिनब्रिज को कॉल को हल करेगा)

1

सी # डीएलएल स्वयं निहित नहीं हैं । यदि आपके 3.5 डीएलएल को LINQ की आवश्यकता है, तो यह 3.5 (3.0 सटीक) ढांचे से सिस्टम असेंबली पर निर्भर करता है, इसलिए पूरा एप्लिकेशन इस संस्करण पर निर्भर करता है।

आप गतिशील रूप से 3.5 असेंबली लोड कर सकते हैं और आपको आवश्यक कार्यों तक पहुंच प्राप्त करने के लिए प्रतिबिंब का उपयोग कर सकते हैं। इसके लिए कुछ ओवरहेड की आवश्यकता है।

6

मैं System.Core उपयोग कर रहे हैं और एक ASP.NET 2.0 अनुप्रयोग में नया System.Web.Extensions (उदाहरण के लिए) 3.5 से अब थोड़ी देर के लिए (VS2005 का प्रयोग करके) कोई समस्या नहीं के साथ। स्कॉट हंसेलमैन ने here के बारे में ब्लॉग किया था। तो हाँ, यह संभव है।

.NET 3.5 अभी भी उसी सीएलआर पर .NET 2.0 के रूप में चलता है। तो रनटाइम पर यह सब वही है। (मान लीजिए कि आपने किसी भी निर्भरता को ट्रैक किया है और उन 3.5 डीएलएल को आपके बिन फ़ोल्डर में भी कॉपी किया है।)

केवल वास्तविक सीमा सी # भाषा विशेषताएं है जो आप विकास के समय उपयोग कर सकते हैं। जैसे 'var', एक्सटेंशन विधियां, या LINQ क्वेरी सिंटैक्स।

2

यदि आप .NET 3.5 लाइब्रेरी का उपयोग कर रहे हैं तो आपके आवेदन की आवश्यकताएं ऐसी होनी चाहिए कि इसके एपीआई के किसी भी उपभोक्ता को भी .NET 3.5 का उपयोग करना चाहिए।

एक ही तरीका है कि आप इस बायपास कर सकते हैं यदि आप इसे के साथ सभी अपने आवेदन की निर्भरता पैकेज है। इसका मतलब है कि आपके एप्लिकेशन का उपयोग पुस्तकालयों का उपयोग करता है जो .NET 3.0 और 3.5 फ्रेमवर्क पर निर्भर करता है।

हालांकि, मुझे .NET ढांचे के हिस्सों को बाहर निकालने और उन्हें ऐप के साथ पैकेज करने की वैधता सुनिश्चित नहीं है। मैं ऐसा कुछ करने से पहले EULA पढ़ूंगा। आईएमओ, यह परेशानी के लायक नहीं है; बस 3.5 स्थापित करें, अपने उपयोगकर्ताओं से 3.5 स्थापित करने के लिए कहें और इसके साथ किया जाए या केवल 2.0 फीचर्स और लाइब्रेरी का उपयोग करें। कम से कम, इस तरह के आसपास हैकिंग केवल भविष्य में ढांचे के अपडेट होने पर आपको तैनाती के साथ और अधिक दर्द का कारण बन जाएगी।

किसी भी मामले में, आपका ऐप 3.0 के रूप में .NET 2.0 पर काम करेगा और 3.5 2.0 रनटाइम और पुस्तकालयों (जैसे क्रेग का उल्लेख किया गया) के शीर्ष पर अतिरिक्त पुस्तकालय हैं, जब तक आपकी सभी निर्भरताएं हों।

+0

मैं इस तरह की चीज के बारे में बिल्कुल सोच रहा था, केवल इतना है कि मैं कुछ भी चीर नहीं करता हूं, लेकिन मैं यह कह रहा हूं कि पुस्तकालय के लिए क्या आवश्यकता है। अभी तक मुझे अभी भी हैरान है कि सी # लाइब्रेरी को ब्लैक बॉक्स की तरह नहीं माना जाता है, लेकिन इसके आंतरिक "रिसाव" हैं। इसका मतलब यह भी है कि सी # प्लगइन के लिए उपयुक्त नहीं है, क्योंकि यदि एपीआई अनुपालनशील है, लाइब्रेरी में इस्तेमाल किए गए नए .NET के साथ इसका मतलब पूरे एप्लिकेशन को पुनर्निर्माण करना होगा। – greenoldman

+1

मुझे लगता है कि आपके पास .NET और C# उलझन में है। भाषा रनटाइम के समान नहीं है। साथ ही, एक नए .NET संस्करण के लिए लाइब्रेरी का पुनर्निर्माण करने के लिए ** ** की आवश्यकता नहीं है **। आपको केवल ** पुनर्निर्माण की आवश्यकता है ** यदि ** आप नए संस्करण की विशेषताओं का उपयोग कर रहे हैं। – alimbada

1
कुछ नहीं बहुत

लेकिन वहाँ तरीके खुशी से (वरीयता के क्रम में) एक साथ काम कर कोड प्राप्त करने के हैं:

1) 3,5

करने के लिए दोनों परियोजनाओं का नवीनीकरण अगर मैं तुम्हें सही ढंग से तो अपने को समझते हैं। नेट एफडब्लू 2.0 प्रोग्राम 3.5 लाइब्रेरी पर निर्भरता रखेगा, जिसका मतलब है कि कार्यक्रम की हर कार्यक्षमता के लिए काम करना है, अब इसे एफडब्ल्यू 3.5 की आवश्यकता है। चूंकि आप प्रोग्राम को पुन: संकलित करने के लिए कोड और प्राधिकरण रखते हैं और तैनाती पर जो कुछ भी एफडब्लू इंस्टॉल करते हैं, उसके बाद आप इसे 3.5 तक अपग्रेड कर सकते हैं। सरल लगता है, लेकिन मुझे लगता है कि आपने ऐसा नहीं किया है, तो मुझे लगता है कि आपके पास अच्छे कारण हैं (जैसे अन्य प्रोग्राम कॉल श्रृंखला को ऊपर ले जा रहे हैं जिन्हें आप 3.5/रीकंपाइल पर अपग्रेड नहीं कर सकते हैं।)

2) FW2 के आसपास जाएं। 0 कंपाइलर

लाइब्रेरी के 2.0 संस्करण (या डमी, केवल सार्वजनिक एपीआई प्रदान करते हुए) का संदर्भ देते समय प्रोग्राम बनाएं। प्रोग्राम के बिना अलग-अलग लाइब्रेरी का 3.5 संस्करण बनाएं (इसलिए गलत एफडब्लू असेंबली को संदर्भित करने की आवश्यकता को हटाएं) और 2.0 संस्करण के बजाय 3.5 संस्करण को तैनात करें। चूंकि 2.0 और 3.5 उसी सीएलआर रनटाइम का उपयोग करते हैं तो संकलक को बेवकूफ बनाना पर्याप्त है। जब तक तैनाती मशीनिंग में एफडब्ल्यू 3.5 स्थापित होता है, तब तक सबकुछ ठीक होना चाहिए। नोट: सब कुछ ठीक है भले ही आपके पास तैनाती मशीन पर मौजूद .NET 2.0 मौजूद है और उपयोगकर्ता .NET 3.5 कक्षाओं को कॉल नहीं करता है। वह करता है, वहाँ दुर्घटना हो जाएगा;)

3) 2,0

को लाइब्रेरी डाउनग्रेड अगर आप .net परिवार कल्याण का केवल कुछ वर्गों का उपयोग तो आप उन लापता भविष्य जोड़कर 2.0 संकलक का उपयोग कर रह सकता है परियोजना के लिए असेंबली। (यह क्रेग द्वारा साझा हंसेलमैन लिंक का समाधान है)। जैसा कि पहले से ही उल्लेख किया गया है, आप 3.5 कंपाइलर की सिंटैक्टिक चीनी जैसे वर्स खो देंगे।

चुनें जो भी आपकी स्थिति के लिए उपयुक्त है।