开发者

How do I wrap a C++ interface (abstract class) in C++/CLI?

开发者 https://www.devze.com 2023-03-15 09:39 出处:网络
I have some C++ code: namespace Compute { class __declspec(dllexport) IProgressCB { public: virtual void progress(int percentCompleted) = 0;

I have some C++ code:

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

that I need to call from C#.

Therefore I want to wrap this C++ code in C++/CLI.

I understand how to wrap the compute() function, but how do I wrap the IProgress interface?

(It seems it is not possible for a .Net class to inherit a C++ class?)


Use a ref class which holds a pointer to the wrapped instance:

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, ...);
        }
    };
}


This framework should get you started:

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号