2010-10-07 8 views
7

मेरे पास देशी सी ++ में एक बड़ा एप्लीकेशन लिखा गया है। मेरे पास सी # में एक कक्षा भी है जिसे मुझे कॉल करने की आवश्यकता है।सी ++ इंटरऑप: मैं मूल सी ++ से सी # कक्षा कैसे कॉल करूं, मोड़ के साथ वर्ग गैर स्थैतिक है?

यदि सी # वर्ग स्थैतिक था, तो यह छोटा होगा (वेब ​​पर बहुत सारे उदाहरण हैं) - बस मिश्रित सी ++/सीएलआई रैपर लिखें, इंटरफेस निर्यात करें, और आप कर चुके हैं।

हालांकि, सी # कक्षा गैर स्थैतिक है, और इसे स्थिर में बदला नहीं जा सकता क्योंकि इसमें एक इंटरफ़ेस है (यदि आप सी # कक्षा स्थिर बनाने का प्रयास करते हैं तो संकलक एक त्रुटि उत्पन्न करेगा)।

क्या कोई इस समस्या में पहले से चला है - मैं देशी सी ++ में गैर-स्थैतिक सी # कक्षा कैसे निर्यात करूं?


अद्यतन 2010-11-09

अंतिम समाधान: COM की कोशिश की, इस अच्छी तरह से काम किया लेकिन संरचनाओं का समर्थन नहीं किया। तो, एक सी ++/सीएलआई रैपर के साथ चला गया, क्योंकि मुझे पूरी तरह से सी ++ और सी # के बीच संरचनाओं को पारित करने में सक्षम होने की आवश्यकता थी। मैं कोड यहाँ पर आधारित एक मिश्रित मोड .dll आवरण लिखा है:

के रूप में लक्ष्य वर्ग गैर स्थिर था, मैं सिंगलटन का इस्तेमाल करना पड़ा यह सुनिश्चित करने के लिए पैटर्न कि मैं केवल लक्ष्य वर्ग की एक प्रति को तत्काल कर रहा था। यह सुनिश्चित करता है कि चश्मे को पूरा करने के लिए सब कुछ तेज़ था।

मुझसे संपर्क करें यदि आप मुझे डेमो प्रोजेक्ट पोस्ट करना चाहते हैं (हालांकि, उचित होने के लिए, मैं सी ++ से सी # कॉल कर रहा हूं, और इन दिनों अधिकांश लोग सी #+ से सी ++ को कॉल करना चाहते हैं)।

+0

मुझे पता है कि मुझे कुछ हफ्तों में इसकी आवश्यकता होगी, इसलिए मुझे जवाब में बहुत दिलचस्पी है। – dwo

+0

अरे, एक देखा हुआ मोड़ है। प्रश्न के अंत में, जब आप कम से कम इसकी उम्मीद करते हैं! –

उत्तर

10

सी ++/सीएलआई या COM interop स्थिर के साथ गैर स्थैतिक वर्गों के साथ ही काम करता है। सी ++/सीएलआई का उपयोग करके आप केवल अपनी असेंबली का संदर्भ लेते हैं जिसमें गैर स्थैतिक वर्ग होता है और फिर आप एक नए उदाहरण के संदर्भ प्राप्त करने के लिए gcnew का उपयोग कर सकते हैं।

आपको क्या लगता है कि यह आपके गैर-स्थैतिक वर्ग के साथ संभव नहीं है?

संपादित करें: उदाहरण कोड here है।

using namespace System; 

public ref class CSquare 
{ 
private: 
    double sd; 

public: 
    CSquare() : sd(0.00) {} 
    CSquare(double side) : sd(side) { } 
    ~CSquare() { } 

    property double Side 
    { 
    double get() { return sd; } 
    void set(double s) 
    { 
     if(s <= 0) 
     sd = 0.00; 
     else 
     sd = s; 
    } 
    } 

    property double Perimeter { double get() { return sd * 4; } } 
    property double Area { double get() { return sd * sd; } } 
}; 

array<CSquare ^>^CreateSquares() 
{ 
    array<CSquare ^>^sqrs = gcnew array<CSquare ^>(5); 

    sqrs[0] = gcnew CSquare; 
    sqrs[0]->Side = 5.62; 
    sqrs[1] = gcnew CSquare; 
    sqrs[1]->Side = 770.448; 
    sqrs[2] = gcnew CSquare; 
    sqrs[2]->Side = 2442.08; 
    sqrs[3] = gcnew CSquare; 
    sqrs[3]->Side = 82.304; 
    sqrs[4] = gcnew CSquare; 
    sqrs[4]->Side = 640.1115; 

    return sqrs; 
} 
+0

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

+0

@ ग्रेविटास - –

+0

संपादित करें उत्कृष्ट, धन्यवाद। पूर्णता के लिए, आपके द्वारा संदर्भित स्रोत कोड एमएसवीएस 2003 के लिए डिज़ाइन किया गया है, और एमएसवीएस 2005 में अपग्रेड किए जाने तक काम नहीं करेगा, निर्देश और अद्यतन स्रोत http://msdn.microsoft.com/en-us/magazine/cc163602 पर हैं। एएसपीएक्स (धन्यवाद @ सर्गी)। – Contango

3

दो विकल्प दिमाग में आते हैं।

  1. क्लास को COM ऑब्जेक्ट के रूप में एक्सपोज़ करें और इसे C++ से COM ऑब्जेक्ट के रूप में उपयोग करें।
  2. एक स्थैतिक सी # कक्षा बनाएं जो गैर-स्थैतिक सी # कक्षा के साथ बातचीत करने के लिए एक इंटरफ़ेस का खुलासा करे।
+0

मैंने COM के साथ जाने का फैसला किया, और यह पूरी तरह से काम करता है। इस सवाल का जवाब देने में आपके समय के लिए बहुत बहुत धन्यवाद - बहुत सराहना की। – Contango

1

मैंने इस विषय की दो साल पहले जांच की है: मैं देशी कोड से log4net और Npgsql लाइब्रेरी का उपयोग करना चाहता हूं जो बिना/clr कुंजी के संकलित करता है।

इस तकनीक उसके दो उल्लेखनीय लेख में पॉल दिलाससिया द्वारा वर्णित के पीछे मुख्य विचार:

Managed Code in Visual Studio 2005

Use Our ManWrap Library to Get the Best of .NET in Native C++ Code

इस समाधान है कि स्मार्ट सूचक gcroot और intptr_t में मुख्य विचार बिल्कुल एक ही है स्मृति में प्रतिनिधित्व। और हम GCROOT (टी) नामक एक मैक्रो बनाते हैं जो प्रबंधित कोड में gcroot का उपयोग करता है और unptaged में intptr_t का उपयोग करता है। और हम मूल इंटरफ़ेस के साथ डीएलएल बनाते हैं और कार्यान्वयन प्रबंधित करते हैं और हमारे मूल कोड से इस डीएल का उपयोग करते हैं।

मेरे प्रबंधित कक्षाओं के लिए कुछ एडाप्टर बनाना और देशी सी ++ दुनिया में उनका उपयोग करना और मेरे स्रोत कोड को बिना/क्लियर कुंजी के संकलित करना बहुत आसान था।

+0

मैंने आपके द्वारा संदर्भित कोड पर एक नज़र डाली थी, और इसका उपयोग करना बहुत आसान लगता है: मैं COM और कोड दोनों को लागू कर दूंगा, और इसे सही करने के लिए अपना मूल प्रश्न संपादित करूंगा। बहुत धन्यवाद! – Contango

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