2009-12-31 12 views
5

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

enter image description here

तो मुझे बताओ, यह बेहतर किया जा सकता है:

यहाँ मैं अब तक राशि है?

+0

सी ++ होने की आवश्यकता क्यों है? – SLaks

+1

क्योंकि एक मौजूदा कोड बेस है जो सी ++ एपीआई का खुलासा करता है, और यह मेरा लिंगुआ फ़्रैंका है। मैं अपने पॉइंटर्स के बिना खो जाऊंगा। –

उत्तर

11

इसे संभालने का सबसे आसान तरीका सी ++/सीएलआई का उपयोग करना है, और अपने तर्क को .NET प्रकारों के रूप में बेनकाब करना है।

ref class में मूल C++ क्लास को लपेटना बहुत आसान है जो सीधे सी # उपयोगकर्ता इंटरफ़ेस से उपयोग योग्य है।

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

मेरा अनुभव यह रहा है कि गति कोई मुद्दा नहीं रहा है - असुरक्षित सी # कोड लगभग हमेशा समेकित सी ++ की तुलना में तेज़ या तेज होने में कामयाब रहा है, और यह आसान है और सी # कोड को ट्यून करना आसान है।

+0

तो क्या Proxy.dll में रखा गया रैपर कोड यह वही रणनीति है? क्या मैं इसे "मेरे लिए अच्छा लग रहा है" के रूप में ले सकता हूं? –

+0

जहां तक ​​आपके आरेख का .NET/C++ इंटरफ़ेस हिस्सा जाता है, हां, यह अच्छा लगता है। मैंने एक ही प्रकार की चीज की है जिसमें एक मौजूदा सी ++ कोड बेस है जहां मैं सी # में जीयूआई करना चाहता था। – AaronLS

+0

मैंने भी सी कोड को सी # में फिर से लिखा है और मैंने जो प्रदर्शन देखा है उससे बहुत संतुष्ट हूं। इसे एक बहुत ही प्रोसेसर गहन आवेदन होना चाहिए जो इसे नोटिस न करे। –

1

आपके कोर के लिए डीएलएल होने का एक अच्छा कारण हो सकता है। लेकिन यह जरूरी नहीं है। मुझे सी ++ के एक एप्लिकेशन के साथ सफलता मिली है, यह एक ऐप डोमेन बनाता है और इसमें एक असेंबली लोड करता है, फिर ऐप डोमेन में ऑब्जेक्ट को तुरंत चालू करता है और इसे कॉल करता है, इसे एप्लिकेशन में इंटरफ़ेस पास करता है। यह मूल रूप से सी-रनटाइम करता है जब आप एक अप्रबंधित ऐप बनाते हैं।

इंटरफ़ेस जो C++ कोड C# कोड को प्रकट करता है उसे सी # में परिभाषित किया गया है। मुझे लगता है कि यह शुद्ध COM में intefaces को परिभाषित करने से आसान है। सी # इंटरऑप आपको सी ++ की तुलना में मार्शलिंग का अधिक नियंत्रण देता है।

  • एक फ़ाइल app_interface.cs कि इंटरफेस
  • एक dll में app_interface.cs संकलन को परिभाषित करता है बनाते हैं तो हम dll के बारे में परवाह नहीं है। हमें पुस्तकालय की आवश्यकता है। app_interface.tlh
  • लागू इंटरफेस

आप विशेषताओं मार्शलिंग को नियंत्रित के साथ अपने app_interface.cs छिड़क कर सकते हैं: सी में

  • ++ कोड #import <app_interface.tlb> raw_interfaces_only इस एक सी ++ इंटरफ़ेस परिभाषा के साथ ज फ़ाइल में typelib बदल जाता है इस तरह

    [ComVisible(true)] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    [Guid("ffffffff-ffff-ffff-ffff-ffffffffffff")] // guid changed from what I really use 
    public interface IMyHostApplication 
    { 
        ... 
    
        void AddErrorDetails (
         [MarshalAs(UnmanagedType.Error)] uint hr, 
         [MarshalAs(UnmanagedType.LPWStr)] string szErrDetails); 
    
        ... 
    } 
    
  • +0

    मैं सी # कोड को जितना संभव हो सके सी # कोड से अलग करना चाहता हूं, सतह क्षेत्र को न्यूनतम रखता हूं। साथ ही, मैं देशी कोड कर रहा हूं, जबकि मैं प्रबंधित कोड के बारे में सोचना नहीं चाहता। –

    +0

    मुख्य बिंदु यह है कि जब स्क्रैच से शुरू होता है तो शुरुआत से सी # में दो हिस्सों के बीच के अंतर को परिभाषित करना आसान होता है। #import gurantees कि सी ++ और सी # इंटरफेस परिभाषा के रूप में क्या देखते हैं दोनों एक ही फाइल से आते हैं। –

    +0

    कोई फर्क नहीं पड़ता कि आप यह कैसे करते हैं, आपको निश्चित रूप से सी ++ और सी # के बीच इंटरफ़ेस के सतह क्षेत्र को कम करने का प्रयास करना चाहिए –

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