2009-06-19 19 views
8

मैं एक छोटा ऐप लिख रहा हूं जिसके लिए कुछ सूची बॉक्स, बटन, टेक्स्टबॉक्स की आवश्यकता है। यह बूस्ट, MySQL, आदि सी ++ स्थिर libs के साथ जोड़ा जाएगा। परियोजना के लिए Win32 कार्यों की आवश्यकता है। मुझे लगता है कि विनफॉर्म ठीक होंगे (एमएफसी और कोडजॉक को बहुत अधिक समय की आवश्यकता है)।.NET GUI - C# बनाम सी ++/सीएलआई

तो सी ++/सीएलआई नौकरी के लिए बिल्कुल सही लगता है। जीयूआई के साथ बस मानक सी ++ का प्रयोग करें। फिर मैं सूत्रों को चलाता हूं कि आप अपने जीयूआई को इसके बजाय सी # में लिखते हैं। फिर अपने मानक सी ++ डीएलएल के लिए पी/Invoke (धीमी) या एक सी ++/सीएलआई इंटरफ़ेस का उपयोग करें।

उदाहरण: http://social.msdn.microsoft.com/Forums/en-US/clr/thread/6ae877ac-07b4-4d26-8582-de475ee9a5cb

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

मुझे समझ में नहीं आता कि आप सी # का उपयोग क्यों करेंगे, और फिर इसे "इंजन डीएलएल" से अलग करने के लिए अभी तक जाएं। बेशक, अन्य इंजनों के लिए "इंजन डीएलएल" का भी उपयोग नहीं किया जा रहा था।

धन्यवाद

+3

पी/Invoke धीमा नहीं है अगर यह सही ढंग से उपयोग किया जाता है। हमारा ऐप पी # के साथ बुलाए गए सी #+ के 200k + और 200k + के बारे में है और यह एनीमेशन/आदि के साथ इंटरैक्टिव फ़्रेमेट प्रबंधित करता है। आपको बस यह सुनिश्चित करने की ज़रूरत है कि सी # और डीएलएल के बीच आपके इंटरफेस स्वच्छ और न्यूनतम हैं। –

+0

@RonWarholic मैं पी/Invoke से इतना परिचित नहीं हूँ, लेकिन कोड की 200k लाइनों की फ़ंक्शन घोषणाओं को पूरी तरह से लिखना मुश्किल नहीं है? – MasterMastic

+0

यदि आप अपना खुलासा एपीआई साफ और तंग रखते हैं तो बहुत अधिक पुनर्लेखन नहीं होता है। पुस्तकालय में हजारों कार्य हैं लेकिन केवल 80 या तो सी # पक्ष के संपर्क में हैं। –

उत्तर

19

मैं तथ्य यह है कि सी # C++/CLI से साथ NET अनुप्रयोगों बनाने के लिए सिर्फ एक बेहतर माहौल है चारों ओर इस सवाल का केंद्र के संबंध में सबसे सिफारिशों लगता है। सिंटैक्स क्लीनर है, टूलिंग बेहतर है - दोनों विजुअल स्टूडियो और तीसरे पक्षों के भीतर। आपको डेवलपर्स से अधिक से बेहतर समर्थन मिलेगा जो लगभग सभी सी # से अधिक परिचित होंगे।

सी ++/सीएलआई अनुप्रयोग उन सभी^और% अक्षरों के साथ मानक सी ++ से काफी अलग हैं जिन्हें मुझे कम से कम लगता है कि यह सी ++ नहीं है।

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

मेरी सामान्य सलाह आपके आवेदन के लिए जितना संभव हो उतना कोड बनाने के लिए सी # (या वीबी.नेट) का उपयोग करना है। Win32 API और/या तृतीय पक्ष SDK को कॉल करने की आपकी आवश्यकता होने पर P/Invoke का उपयोग करें और इंटरफेस और पैरामीटर सरल हैं। जब यह संभव नहीं है तो एक गोंद परत के रूप में C++/CLI का उपयोग करें।

एक टीम के माहौल में, आपके साथी डेवलपर आपको सी ++/सीएलआई के उपयोग को सीमित करने के लिए धन्यवाद देंगे, जहां यह बिल्कुल सही है, सकारात्मक रूप से आवश्यक है। सी ++/सीएलआई विशेषज्ञता सिर्फ इतना आम नहीं है।

+0

सी ++/सीएलआई से बचें यदि * सभी * संभव है - एक सी ++ सीएलआई कोडर के रूप में मैं बस इतना कह सकता हूं - उत्कृष्ट सलाह। अपने खतरे वाले लोगों पर इसे अनदेखा करें! – mackenir

0

मुझे इस बारे में आश्चर्य हुआ, इसलिए विजुअल स्टूडियो 2008 के साथ मैंने भाषा के रूप में सी ++/सीएलआई का उपयोग करके एक नया विंडोज फॉर्म एप्लीकेशन प्रोजेक्ट बनाया। पहली चीज यह एक त्रुटि फेंक दिया है। तो मैंने इसे एक संकेत के रूप में लिया कि यह सामान उपयोग के लिए तैयार नहीं है। शायद मैं इसे एक मौका नहीं दे रहा हूँ!

The file 'c:\source\Test\Test\Form1.h' does not 
support code parsing or generation 
because it is not contained within a 
project that supports code. 

यह तब होता है जब भी मैं जादूगर रूप से बनाए गए Form1.h फ़ाइल खोलने का प्रयास।

+1

मेरे लिए ठीक काम करता है। यह मूल सी ++ भी चलाता है यदि आप इसे/clr पर डालते हैं और बंद/clr: शुद्ध। तो आप एक अच्छे Winforms यूआई के साथ शुरू करते हैं, और अपने सामान्य सी ++ कोड का उपयोग करें। बेशक मैं $ 10 शर्त पुस्तकालयों/आदि के साथ कुछ दिनों में परेशानी में भाग जाऊंगा। और सी # यूआई या क्यूटी यूआई पर स्विच करना होगा। –

4

व्यक्तिगत रूप से, मुझे सी ++/सीएलआई पसंद है, लेकिन मैं अभी भी सी # में अपना यूआई लिखूंगा।

सी ++/सीएलआई महान सीधे Win32 के साथ काम करने या विरासत कोड से बात करने के लिए, लेकिन यह यूआई कोड की बात करते समय मेरी पसंद के लिए थोड़ा वर्बोज़ है। सी # में WinForms यूआई कोड अच्छा और सरल है (अधिकांश भाग के लिए, हाहा)। सी ++ में यूआई कोड लिखना लगभग हमेशा गन्दा होता है (बस एमएफसी देखें)।

क्यों न केवल एक सी # असेंबली में अपना यूआई बनाएं और सी ++/सीएलआई असेंबली में अपने सभी निम्न-स्तरीय कोड डालें? सी ++/सीएलआई के बारे में अच्छी बात यह है कि आप एक प्रबंधित परत बना सकते हैं जिसे आपका सी # कोड आसानी से कॉल कर सकता है। वह प्रबंधित परत तब सीधे सी ++ या सी कोड की मूल परत पर कॉल अग्रेषित कर सकती है।

+0

यह मेरा बिल्कुल सही था, मेरा प्रश्न क्या था, सी # में यूआई क्यों बनाएं और देशी सी/सी ++ कोड को कॉल करने के लिए सी ++/सीएलआई प्रबंधित परत बनाएं। इसलिए मूल रूप से अंतर यूआई स्क्रिप्टिंग के लिए एक बेहतर/क्लीनर वाक्यविन्यास है और जैसा कि किसी और ने सी # यूआई को इंगित किया है कि बेहतर टूलिंग समर्थन है। –

+0

डेटा संरचनाओं से संबंधित चीजों के लिए सी ++/सीएलआई का उपयोग करने में कितना प्रदर्शन लाभ है? संग्रह के लिए बीसीएल की तुलना में एसटीएल काफी तेजी से है? –

2

क्या लाभ के बजाय अपनी WinForms जीयूआई के लिए सी # का उपयोग करने में है C++/CLI (वे एक ही लग रही है आदेशों एक ही हैं)?

वे समान नहीं दिखते हैं। सी # मेरी राय क्लीनर में है और इसमें कुछ उपयोगी अवशोषण हैं। टूलिंग समर्थन सी # या वीबीनेट के लिए भी काफी बेहतर है। जो सी # पहले मारा और VB.net जल्द ही पास आ लेकिन शायद ही कभी अपने रास्ते के लिए नीचे खोजने के लिए करते हैं की तरह लैम्ब्डा भाव, LINQ, प्रकार निष्कर्ष, आदि

Look here for an example comparison

और भूल नहीं है उत्पादक भाषा सुविधाओं C++/CLI।

0

मैं एक छोटा ऐप लिख रहा हूं जिसके लिए कुछ सूची बॉक्स, बटन, टेक्स्टबॉक्स की आवश्यकता है। यह बूस्ट, MySQL, आदि सी ++ स्थिर libs के साथ जोड़ा जाएगा। परियोजना Win32 कार्यों की आवश्यकता है ...

मैं शायद मिल जोखिम downvoted लिए किया जाएगा, लेकिन, यदि आपका कोड के सबसे पहले से ही C++ लिखा है और सी ++ कार्यक्षमता का उपयोग, यह आपके जीयूआई लिखने के लिए आसान हो woudn't में मूल सी ++।

आपको जीयूआई बनाने के लिए एमएफसी का उपयोग करने की आवश्यकता नहीं है। Qt4 पर एक नज़र डालें, उनके पास बहुत अच्छा ट्यूटोरियल है ताकि आप कुछ घंटे के साथ सी ++ में जीयूआई लिखना शुरू कर सकें।

+0

डब्ल्यूटीएल मूल विंडोज यूआई के लिए एक और अच्छी पसंद है। –

+0

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

0

हाँ ऐसा लगता है कि ज्यादातर लोग सी # से अधिक सी ++ का उपयोग करने का सुझाव देते हैं मान लें कि आप पहले से ही सी # जानते हैं या इसे सीखने में समय निवेश करने के इच्छुक हैं। मुझे नहीं लगता कि सी ++/सीएलआई WinForms पर सभी नफरत क्या है। कम से कम यदि आप मौजूदा सी ++ कोड पर पोर्ट करना चाहते हैं तो यह काम पूरा हो जाता है। कम से कम मैंने WinForms/CLI का उपयोग कर अपने मौजूदा सी ++ में एक जीयूआई पर काम किया है। हाँ मैं शायद सी # का उपयोग करता है, तो मैं के बाद से शून्य से शुरू किया गया था:

1 मैं पहले से ही सी

का उपयोग कर पता सी

2 मैं जानता हूँ कि यह एक बहुत आसान है और कोड के लिए जल्दी लेकिन जैसे मैं अगर आप ने कहा पहले से ही सी ++ कोड बिछा रहा है क्या आप वास्तव में स्क्रैच से शुरू करना चाहते हैं?

+1

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