2009-02-20 11 views
42

में मेरे पास एक अप्रबंधित सी ++ डीएलएल है जो केवल एक एकल वर्ग (COM नहीं ... यह सिर्फ एक साधारण सी ++ वर्ग) को इसके इंटरफ़ेस के रूप में निर्यात करता है। मैं इस कक्षा का उपयोग सी # में करना चाहता हूं लेकिन मुझे बताया गया है कि इसे केवल सी # में आयात नहीं किया जा सकता है।सी #+ कक्षा डीएलएल का उपयोग सी # अनुप्रयोग

मेरे सी # एप्लिकेशन में इस कक्षा का उपयोग करने का सही तरीका क्या है?

+1

क्या यह एक COM क्लास है? –

+1

क्षमा करें मुझे और अधिक विशिष्ट होना चाहिए था। यह एक COM कक्षा नहीं है। यह सिर्फ एक सादा पुराना सी ++ वर्ग है। – cjserio

उत्तर

43

सरल तरीका यह सोचते वर्ग फू:

  1. एक C++/CLI प्रोजेक्ट बनाएं, इस FooWrapper कहते हैं।
  2. FooWrapper अप्रबंधित डीएल पर निर्भर करता है (हालांकि आप आमतौर पर चाहते हैं)।
  3. एक प्रबंधित कक्षा प्रबंधित प्रबंधित करें जिसमें Foo * प्रकार का एक निजी उदाहरण फ़ील्ड शामिल है।
  4. प्रबंधित प्रबंधित में सार्वजनिक रैपिंग फ़ंक्शंस प्रदान करता है जो अंतर्निहित उदाहरण फ़ील्ड पर आगे बढ़ता है।
  5. वैकल्पिक रूप से (हालांकि अनुशंसित): सी ++ मुहावरे (std :: स्ट्रिंग या चार *)
  6. पकड़ अप्रबंधित अपवादों के .net मुहावरे (तार और की तरह) से
    • परिवर्तित मापदंडों और कामयाब लोगों फेंक बजाय

तो फिर आप अपने ग # कोड FooWrapper परियोजना/dll पर निर्भर करते हैं और सुनिश्चित करें कि अप्रबंधित ll ठीक से, इसके साथ तैनात किया जाता है कि कैसे किया जाता है अप्रबंधित dll पर, लेकिन एक ही निर्देशिका में निर्भर करता है बनाने के सामान्य रूप से पर्याप्त है ।

कार्यों वर्ग के उदाहरण पर भरोसा नहीं है, तो भी सरल है पी/आह्वान

+0

यदि ओपी स्ट्रिंग्स या अपवादों से निपट रहा है तो मैं वैकल्पिक (5) वैकल्पिक नहीं कहूंगा। –

+0

यदि मैं सी ++ डीएलएल परत से छुटकारा पाना चाहता हूं और केवल एक सी ++/सीएलआई प्रोजेक्ट बनाना चाहता हूं जो डीएलएल और रैपर दोनों में से एक है तो मैं क्या करूँगा? अधिक विशेष रूप से, मेरे वर्तमान सी ++ डीएलएल सिर्फ एक अच्छा इंटरफ़ेस में स्थिर libs का एक गुच्छा लिंक करता है। क्या मैं इस काम को सी ++/सीएलआई प्रोजेक्ट में कर सकता हूं? – cjserio

+0

हाँ आप इस सी ++/सीएलआई – ShuggyCoUk

2

आप कामयाब/अप्रबंधित सीमा को पाटने के लिए एक प्रॉक्सी (GOF पैटर्न) मध्यस्थ की जरूरत है।

दो विकल्प:

  • एक C++/CLI आवरण
  • एक COM आवरण।

पूर्व अधिक प्रत्यक्ष होगा, और बाद में दो चरण शुद्ध सी ++ -> COM -> .NET है।

+0

क्या आप दूसरे विकल्प के लिए कुछ लिंक/जानकारी प्रदान कर सकते हैं। धन्यवाद – rsjethani

+0

@rsjethani: मेरे पास हाथ नहीं है: एक COM wrapper बनाने का अर्थ लेखन (मूल) COM है। फिर .NET के लिए रैपर बनाने के लिए 'implib' का उपयोग करना। – Richard

8

यह उत्तर एक वर्ग पुस्तकालय के लिए अधिक हो सकता है, लेकिन SWIG अन्य भाषाओं से उपयोग के लिए "रैपिंग" सी/सी ++ कक्षाओं के लिए एक अच्छा समाधान है। यह सी # के साथ अच्छी तरह से काम करता है।

http://www.swig.org/ देखें।

3

DllImport आपकी सबसे अच्छी शर्त है। डेटा प्रकार मालिश का थोड़ा सा हिस्सा है, खासकर अगर आप structs पास कर रहे हैं, लेकिन आप इसके साथ लगभग कुछ भी कर सकते हैं।

2

कभी-कभी, अपना स्वयं का सी इंटरफ़ेस प्रदान करना आसान होता है। SWIG सेटअप के लिए गैर-तुच्छ है। मैंने प्रबंधित सी ++ और सी ++/सीएलआई का उपयोग किया है और वे ठीक हैं। सबसे आसान बस एक सी wrapper कर रहा था (और किसी भी अन्य भाषा के द्वारा इस्तेमाल किया जा सकता है क्योंकि ज्यादातर सी समारोह को कॉल करने का एक तरीका है)।