2012-01-26 15 views
14

मैंने सी # के साथ बड़े पैमाने पर काम किया है, हालांकि, मैं एक प्रोजेक्ट शुरू कर रहा हूं जहां हमारा ग्राहक सभी कोड को सी #+ के बजाय सी ++ में लिखा जाना चाहता है। यह प्रोजेक्ट प्रबंधित (.NET 4.0) और देशी C++ के बीच एक मिश्रण होगा। ऐसा होने के कारण मैंने हमेशा अपनी .NET जरूरतों के लिए सी # से सी ++ पसंद किया है, मुझे आश्चर्य है कि क्या कोई महत्वपूर्ण अंतर है, मुझे सी # और प्रबंधित सी ++ के बीच के बारे में पता नहीं हो सकता है?प्रबंधित सी ++ (सी ++/सीएलआई) बनाम सी #/वीबी.नेट

इसमें कोई अंतर्दृष्टि की सराहना की जाती है।

EDIT प्रबंधित सी ++ कोड के लिए विकिपीडिया को देखते हुए यह दिखाता है कि नया विनिर्देश सी ++/सीएलआई है, और "प्रबंधित सी ++" को बहिष्कृत किया गया है। इसे प्रतिबिंबित करने के लिए शीर्षक अपडेट किया गया।

+0

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

+2

प्रबंधित सी ++ के लिए एकमात्र अच्छा कारण इंटरऑप है। और तथ्य यह है कि आप मूल 'thunks' हो सकता है (गति के लिए, जो प्रबंधित कोड से बहुत तेज हो सकता है, उदाहरण एन्क्रिप्शन)। सी ++/सीएलआई शुद्ध मोड का उपयोग कर आईएमओ बेकार है। – leppie

उत्तर

9

सी ++/सीएलआई एक पूर्ण रूप से .NET भाषा है, और अन्य .NET भाषाओं की तरह यह एक प्रबंधित संदर्भ में बहुत अच्छी तरह से काम करता है। जैसे ही सी # में देशी कॉल के साथ काम करना एक दर्द हो सकता है, मूल सी ++ और प्रबंधित सी ++ दर्द से कुछ मुद्दों का कारण बन सकता है। इसके साथ, यदि आप बहुत देशी सी ++ कोड के साथ काम कर रहे हैं तो मैं सी #+/सीएलआई सी # पर उपयोग करना पसंद करूंगा। बहुत सारे गॉथस हैं जिनमें से अधिकांश को सी ++/सीएलआई नहीं लिखा जा सकता है जैसे कि आप सी # लिख रहे थे और न ही इसे लिखते हैं जैसे कि आप देशी सी ++ लिख रहे थे। यह अपनी बात है।

मैंने कई सी ++/सीएलआई परियोजनाओं पर काम किया है और जिस दृष्टिकोण को मैं वास्तव में लेता हूं वह मूल सी ++ कोड में एप्लिकेशन के विभिन्न स्तरों के संपर्क पर निर्भर करता है। यदि आवेदन का मूल बहुमत मूल है और देशी और प्रबंधित कोड के बीच एकीकरण बिंदु थोड़ा अस्पष्ट है तो मैं पूरे समय सी ++/सीएलआई का उपयोग करूंगा। सी ++/सीएलआई में नियंत्रण का लाभ इसकी समस्याओं से अधिक होगा। यदि आपके पास स्पष्ट इंटरैक्शन पॉइंट हैं जिन्हें अनुकूलित या सारणित किया जा सकता है तो मैं दृढ़ता से सी #+/सीएलआई ब्रिजिंग परत के निर्माण को सी # के ऊपर और सी ++ के साथ सशक्त सुझाव दूंगा। इसका मुख्य कारण यह है कि सी # के लिए उपकरण सी ++/सीएलआई के लिए इसी तरह के औजारों की तुलना में अधिक परिपक्व और अधिक सर्वव्यापी हैं। इसके साथ ही, जिस परियोजना पर मैं काम कर रहा हूं वह सफल रहा है और दूसरा दुःस्वप्न नहीं था।

मैं यह भी सुनिश्चित कर दूंगा कि आप समझते हैं कि ग्राहक इस दिशा में क्यों आगे बढ़ रहा है। यदि विचार यह है कि उनके पास सी ++ डेवलपर्स का समूह है और वे प्रबंधित कोड लिखने के लिए उनके लिए आसान बनाना चाहते हैं, तो मैं क्लाइंट को यह मानूंगा कि सी # सीखना सी ++/सीएलआई सीखना कम चुनौतीपूर्ण हो सकता है।

यदि ग्राहक मानता है कि सी ++/सीएलआई तेज़ है तो यह गलत है क्योंकि वे सभी आईएल के लिए संकलित हैं। हालांकि, अगर ग्राहक के पास मौजूदा या मौजूदा देशी सी ++ विकास है तो वर्तमान पथ वास्तव में सर्वोत्तम हो सकता है।

+0

यह मेरी अज्ञानता हो सकती है, लेकिन सी # से देशी कॉल करने के साथ मेरा अनुभव सुखद रहा है, अगर वास्तव में, भूलने योग्य है क्योंकि आपको अधिकतर समय नहीं करना है। हां, प्रबंधित वस्तुओं को पार करना दर्द हो सकता है, लेकिन यदि आप केवल प्राचीन प्रकार और structs का उपयोग करते हैं, तो यह बहुत सरल है। मैं इस धागे में देख रहा हूं कि सी ++ में मूल कॉल आसान है। क्या आप मुझे प्रबुद्ध कर सकते हैं? – siride

+0

आपके द्वारा बनाई जा रही सभी मूल कॉलों में से एक सी एपीआई है जिसमें वस्तुओं की कोई अवधारणा नहीं है।सी # से सी ++ एपिस का उपयोग करना लगभग असंभव होगा क्योंकि नाम उलझन और अन्य मुद्दों को प्रस्तुत किया गया है। सी ++ में आपके पास मेमोरी असाइनमेंट आवंटन रणनीति लेआउट पर प्रत्यक्ष नियंत्रण है .... इनमें से अधिकतर चीजें सी # में उपलब्ध हैं लेकिन उनके समर्थन के लिए कार्यों की विस्तृत श्रृंखला के साथ आपके पास सी ++ है। – rerun

+0

हाँ, नाम उलझन के बारे में भूल गए। यह दर्द है। सी एपीआई निश्चित रूप से आसान है, लेकिन मुझे कभी भी C++ API का उपयोग नहीं करना पड़ा। इसे अब पा लिया है। – siride

3

मैंने सी ++/सीएलआई के साथ एक प्रोजेक्ट किया है और मुझे कहना है कि यह घृणा था। असल में यह कर्मचारियों, हॉकी खेलों, टीमों, कैलेंडर आदि के बीच व्यापार, प्रबंधन के लिए एक विनफॉर्म एप्लिकेशन था ...

तो आप कल्पना कर सकते हैं कि मेरे रूपों पर प्रबंधित नियंत्रणों की संख्या: कैलेंडर्स/डेट टाइम पिकर्स, कॉम्बो बक्से, ग्रिड इत्यादि

सबसे खराब हिस्सा मेरे बैक एंड के लिए केवल सी ++ प्रकारों का उपयोग करना था, और फ्रंट-एंड के लिए प्रबंधित प्रकारों का उपयोग करना था। सबसे पहले आप एक प्रबंधित स्ट्रिंग में एक std स्ट्रिंग असाइन नहीं कर सकते हैं। आपको सबकुछ बदलना होगा। जाहिर है आपको इसे वापस परिवर्तित करना होगा ...

हर बार जब मुझे ग्रिड भरने की ज़रूरत होती है, तो मैंने अपने सी ++ संग्रह को vector<std::string> जैसे कुछ करने के लिए क्रमबद्ध किया है, इसे मेरी UI लाइब्रेरी में पुनर्प्राप्त करें और उसके बाद इसे छोटा कर दिया और नया बनाया ग्रिड में जोड़ने के लिए DataGridRow। जो स्पष्ट रूप से सी # और कुछ लिंक से एसक्यूएल के साथ 3 मिनट में किया जा सकता है।

मैं उस एप्लिकेशन के लिए ए + के साथ समाप्त हुआ लेकिन ईमानदार होने पर पूरी तरह से चूसने देता है। मैं कल्पना नहीं कर सकता कि अन्य ऐप मेरे लिए यह कितना दयनीय था।

मुझे लगता है कि अगर मैं List<Customer>^ (कुछ ऑब्जेक्ट की प्रबंधित सूची) का उपयोग करता हूं तो यह हमेशा आसान होता है क्योंकि स्ट्रिंग्स के वैक्टरों के बीच हमेशा सबकुछ परिवर्तित करने के बजाय मैं अपने सी ++ में List<Customer>^ (कुछ ऑब्जेक्ट की प्रबंधित सूची) का उपयोग करता। लेकिन मुझे प्रबंधित सामानों की सी ++ साफ रखने की आवश्यकता थी।

/pissedof

+0

जिस तरह से मैं इस परियोजना को आगे बढ़ रहा हूं, प्रबंधित सी ++ का उपयोग अधिकांश परियोजनाओं के लिए किया जाएगा, हालांकि, यह आसानी से सटीक फ्रंट-एंड/बैक-एंड परिदृश्य में बदल सकता है जिसे आपने अभी वर्णित किया है –

+0

मैं गंभीर हूं। यह पूरी तरह से भयानक था। मैं इस ऐप या कुछ का उपयोग/बिक्री करने की कल्पना नहीं कर सकता। – Dave

2

तीनों क्षेत्रों (.NET, C++/CLI और सी ++) का उपयोग कर मैं कह सकता हूँ कि हर तरह से मैं (C# या VB.NET के माध्यम से) नेट उपयोग करने को प्राथमिकता से। एप्लिकेशन के लिए आप WinForms या WPF का उपयोग कर सकते हैं (जिसके बाद मैं बहुत बेहतर खोजता हूं - खासकर उन अनुप्रयोगों के लिए जो अधिक उपयोगकर्ता के अनुकूल दिखते हैं)।

सी ++/सीएलआई के साथ एक बड़ा मुद्दा यह है कि आपके पास .NET में प्राप्त होने वाली सभी अच्छी भाषा सुविधाएं नहीं हैं। उदाहरण के लिए, सी # में yield कीवर्ड और लैम्ब्डा के उपयोग (मुझे नहीं लगता कि यह सी ++/सीएलआई में समर्थित है - मुझे उस पर न रखें)।

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

किसी एप्लिकेशन के फ्रंट एंड को विकसित करने के लिए, हालांकि, मैं वास्तव में सी ++/सीएलआई की अनुशंसा नहीं करता। उपयोगिता बिंदु से (डेवलपर समय के संदर्भ में इसका उपयोग करते समय) यह सिर्फ इसके लायक नहीं है।एक बड़ा मुद्दा यह है कि "सामान्य IntelliSense में सुधार" के लिए VS2010 dropped support for IntelliSense for C++/CLI (मुझे विशेष रूप से सी ++ के लिए लगता है)। यदि आपने पहले से ही यह कोशिश नहीं की है, तो मैं निश्चित रूप से अनुप्रयोगों के लिए डब्ल्यूपीएफ की जांच करने की सलाह दूंगा।

+0

हाँ, 2010 में इंटेलिसेन्स के लिए कोई सी ++/सीएलआई समर्थन एक मुद्दा है जिसे मैं जानता हूं। IntelliSense एक आवश्यकता नहीं है, हालांकि, जो बेकार है क्योंकि मैं अपने वर्कफ़्लो के हिस्से के रूप में प्रतिदिन निर्भर करता हूं। –

+0

और WPF का उपयोग करना "व्यवहार्य नहीं है" क्योंकि, जैसा कि एक और टिप्पणी में उल्लेख किया गया है, क्लाइंट को इसे सीखना होगा। लेकिन मैं एक त्वरित इंटरफेस को फेंकने के लिए डिज़ाइनर का उपयोग क्यों नहीं कर पाऊंगा जैसे कि मैं सी # या वीबी.नेट का उपयोग कर रहा था? क्या यह सी ++/सीएलआई या कुछ के लिए टूट गया है? –

+0

@BasedAsFunk WinForms डिजाइनर जैसा लगता है कि एक .NET प्रोजेक्ट में उपयोग किया जाता है, इसलिए मुझे इंटरफ़ेस प्रोटोटाइप को फेंकने के लिए इसका उपयोग करने में कोई समस्या नहीं है। –

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