2011-06-27 9 views
6

मेरे पास कुछ सी ++ कोड है:मैं सी ++/सीएलआई में एक सी ++ इंटरफेस (अमूर्त वर्ग) कैसे लपेटूं?

namespace Compute { 
    class __declspec(dllexport) IProgressCB { 
    public:  
    virtual void progress(int percentCompleted) = 0; 
    };  
    double __declspec(dllexport) compute(IProgressCB *progressCB, ...); 
} 

मुझे सी # से कॉल करने की आवश्यकता है।
इसलिए मैं इस सी ++ कोड को सी ++/सीएलआई में लपेटना चाहता हूं।

मैं समझता हूं कि गणना() फ़ंक्शन, को कैसे लपेटें, लेकिन मैं आईप्रेशंस इंटरफ़ेस को कैसे लपेटूं?

(ऐसा लगता है कि .NET क्लास के लिए सी ++ कक्षा का उत्तराधिकारी होना संभव नहीं है?)

उत्तर

2

इस ढांचे मिलना चाहिए आपने शुरू किया:

interface class IProgressEventSink 
{ ... }; 

class ProgressEventForwarder : IProgressEventCB 
{ 
    gcroot<IProgressEventSink^> m_sink; 
public: 
    ProgressEventForwarder(IProgressEventSink^ sink) : m_sink(sink) {} 

// IProgressEventCB implementation 
    virtual void OnProgress(ProgressInfo info) { m_sink->OnProgress(info.a, info.b); } 
}; 

ref class ComputeCLI 
{ 
    Compute* m_pimpl; 
// ... 

public: 
    RegisterHandler(IProgressEventSink^ sink) 
    { 
     // assumes Compute deletes the handler when done 
     // if not, keep this pointer and delete later to avoid memory leak 
     m_pimpl->RegisterHandler(new ProgressEventForwarder(sink)); 
    } 
}; 
+0

बीटीडब्ल्यू। क्या आप जानते हैं कि मैं सिंक और फॉरवर्डर कोड के निर्माण को "स्वचालित" कैसे कर सकता हूं? – Andy

+0

@ एंड्रियास: "कोड का निर्माण" बहुत स्पष्ट नहीं है। क्या आपका मतलब "कोड जनरेशन" या "ऑब्जेक्ट निर्माण" है? –

+0

क्षमा करें। मेरा मतलब कोड पीढ़ी है। मैं समझता हूं कि एसडब्ल्यूआईजी सी ++/सीएलआई के बजाय पीएनवोक कोड उत्पन्न करता है, लेकिन ऐसा कुछ, शायद अधिक हल्का वजन आदर्श होगा। – Andy

4

एक ref class जो लिपटे उदाहरण के लिए सूचक रखती है का उपयोग करें:

namespace ComputeCLI { 
    public ref class IProgressCB{ 
    public: 
     void progress(int percentCompleted) 
     { 
      // call corresponding function of the wrapped object 
      m_wrappedObject->progress(percentCompleted); 
     } 

    internal: 
     // Create the wrapper and assign the wrapped object 
     IProgressCB(Compute::IProgressCB* wrappedObject) 
      : m_wrappedObject(wrappedObject){} 

     // The wrapped object 
     Compute::IProgressCB* m_wrappedObject; 
    }; 

    public ref class StaticFunctions{ 
    public: 
     static double compute(IProgressCB^ progressCB, ...){ 
      Compute::compute(progressCB->m_wrappedObject, ...); 
     } 
    }; 
} 
+0

मेरे पास पहले से ही एक सी ++ कक्षा है जिसे आईपीआर प्रोग्रेस सीबी कहा जाता है जिसे सी ++/सीएलआई से शामिल किया जाएगा; तो इस वर्ग को कुछ और कहा जाना चाहिए (उदा। IProgressCLI)? इसके अलावा गणना() विधि एक सी ++ IProgress तो IProgressCLI musth के सूचक के वारिस IProgressCB उम्मीद है, लेकिन इस की अनुमति दी जानी प्रतीत नहीं होता है? – Andy

+1

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

+0

लेकिन मैं सी ++/सीएलआई इंटरफ़ेस को आमंत्रित करने के लिए अपने सी ++ कोड को कैसे बताऊं? "प्रवाह" यहाँ: -: -> सी ++/CLI-> सी ++ सी # सी ++> सी ++/CLI-> सी # आमतौर पर क्या होता है के विपरीत है। – Andy

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