2013-04-12 176 views
6

我一直在搜索圈子试图找到一个完全成熟的例子,但无济于事。C++/CLI从本地C++类继承抽象方法并将其暴露给C#

我有一个C++ API,它提供了许多包含纯虚拟方法供开发人员扩展的类。我试图做的是通过C++/CLI将此接口提供给C#。

我已经设法将API编译到C++/CLI库中,并且由于我刚接触到这一点,所以我已经达到了一个难点。

我知道我需要创建一个包装器以将C++/CLI非托管类展示给托管的.net类,但是我没有找到一个可靠的示例或讨论来展示如何使用抽象C++类。

任何人都可以指向正确的方向,包括一个完整的示例,包括C#测试应用程序,它显示了如何为抽象类创建封装的端到端。它似乎是一个“哦,你只是做X”的事情,但我无法找出X是什么:)。我在这里看到了一些例子,但他们不是很清楚。距离我处理任何C#已经有3年了。

希望有人能帮助!

Sammich

+2

您不能从本机C++类派生托管ref类。你[必须封装](http://stackoverflow.com/a/2691448/17034)它。 –

+0

嗨, 我非常清楚它需要封装,并且您需要提供C++本机类与C#之间的代理/桥接。我见过一些使用gcroot的例子,但他们缺乏细节。我正在寻找的是这种类型的本地抽象C++类封装的端到端示例。 –

+0

我发布了一个例子的链接。我完全不清楚为什么它不适合。 –

回答

7

使用由Hans帕桑特帐为基地的链接代码,以下是我认为你正在寻找。它不会像这样编译,因为我已经写了这个'inline'的例子 - 把所有的方法实现放在.cpp文件中,然后你应该在正确的轨道上。

#pragma managed(push, off) 
#include "oldskool.h" 
#pragma comment(lib, "oldskool.lib") 
#pragma managed(pop) 

using namespace System; 

ref class Wrapper; // You need a predeclaration to use this class in the 
        // constructor of OldSkoolRedirector. 

// Overrides virtual method is native class and passes to wrapper class 
class OldSkoolRedirector : public COldSkool { 
public: 
    OldSkoolRedirector(Wrapper ^owner) : m_owner(owner) { } 
protected: 
    virtual void sampleVirtualMethod() { // override your pure virtual method 
     m_owner->callSampleVirtualMethod(); // body of method needs to be in .cpp file 
    } 
private: 
    gcroot<Wrapper^> m_owner; 
} 

public ref class Wrapper abstract { 
private: 
    COldSkool* pUnmanaged; 
public: 
    Wrapper() { pUnmanaged = new OldSkoolRedirector(this); } 
    ~Wrapper() { this->!Wrapper(); } 
    !Wrapper() { 
     if (pUnmanaged) { 
      delete pUnmanaged; 
      pUnmanaged = 0; 
     } 
    } 
protected: 
    virtual void sampleVirtualMethod() = 0; // Override this one in C# 
internal: 
    void callSampleVirtualMethod(){ 
     if (!pUnmanaged) throw gcnew ObjectDisposedException("Wrapper"); 
     sampleVirtualMethod(); 
    } 
};