如何在C++/CLI中包装C++接口(抽象类)?

And*_*ndy 7 c# interop native c++-cli visual-c++

我有一些C++代码:

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

我需要从C#调用.
因此,我想在C++/CLI中包装此C++代码.

我理解如何包装compute()函数,但是如何包装IProgress接口?

(似乎.Net类不可能继承C++类?)

Ben*_*igt 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));
     }
};
Run Code Online (Sandbox Code Playgroud)