C++/CLI继承自本机C++;使用抽象方法初始化并将其公开给C#

C++/CLI继承自本机C++;使用抽象方法初始化并将其公开给C#,c#,c++,.net,interop,c++-cli,C#,C++,.net,Interop,C++ Cli,我一直在谷歌搜索,试图找到一个完整的例子,但没有成功 我有一个C++ API,它提供了一些包含纯虚拟方法的类,供开发人员从中扩展。我试图通过C++/CLI向C#提供这个接口 我已经成功地将API编译到C++/CLI库中,由于我是新手,所以我遇到了一个难题 我意识到我需要创建一个包装器来将C++/CLI非托管类暴露给托管.NET类,但是我没有找到一个实例化的例子或讨论,它显示了如何用抽象C++类来实现这一点。p> 有人能给我指出一个完整的例子的正确方向吗?这个例子包括C#test应用程序,它展示了

我一直在谷歌搜索,试图找到一个完整的例子,但没有成功

我有一个C++ API,它提供了一些包含纯虚拟方法的类,供开发人员从中扩展。我试图通过C++/CLI向C#提供这个接口

我已经成功地将API编译到C++/CLI库中,由于我是新手,所以我遇到了一个难题

<>我意识到我需要创建一个包装器来将C++/CLI非托管类暴露给托管.NET类,但是我没有找到一个实例化的例子或讨论,它显示了如何用抽象C++类来实现这一点。p> 有人能给我指出一个完整的例子的正确方向吗?这个例子包括C#test应用程序,它展示了如何为抽象类创建包装器。这似乎是一个“哦,你只是做X”的事情,但我无法找出X是什么:)。我在这里看到了一些例子,但它们不是很清楚。我已经三年没有处理过任何C#了

希望有人能帮忙


Sammich

以Hans Passant发布的链接中的代码为基础,我认为您正在寻找以下内容。它不会像这样编译,因为我已经“内联”编写了这个示例——将所有方法实现放在.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(); 
    }
};
#pragma管理(推、关)
#包括“oldskool.h”
#pragma注释(lib,“oldskool.lib”)
#布拉格语管理(pop)
使用名称空间系统;
ref类包装器;//您需要预先声明才能在中使用该类
//OldSkoolRedirector的构造函数。
//重写虚拟方法是本机类,并传递给包装器类
类oldskool重定向器:public COldSkool{
公众:
OldSkoolRedirector(包装器^owner):m_所有者(所有者){}
受保护的:
virtual void sampleVirtualMethod(){//重写纯虚拟方法
m_owner->callSampleVirtualMethod();//方法体需要位于.cpp文件中
}
私人:
GCM_所有者;
}
公共ref类包装抽象{
私人:
COldSkool*朋克;
公众:
Wrapper(){pUnmanaged=new oldskooldRedirector(this);}
~Wrapper(){this->!Wrapper();}
!Wrapper(){
如果(管理){
删除已管理的文件;
pun=0;
}
}
受保护的:
virtual void sampleVirtualMethod()=0;//在C中重写此方法#
内部:
void callSampleVirtualMethod(){
如果(!pUnmanaged)抛出新的ObjectDisposedException(“包装器”);
样本虚拟方法();
}
};

< /代码>不能从本机C++类派生托管ReF类。嗨,我非常清楚它需要封装,你需要在C++原生类与C语言之间提供代理/桥梁。我见过许多使用gcroot的示例,但它们缺乏细节。我所要寻找的是一个端到端的例子,这种类型的封装用于本地抽象C++类。我完全不清楚为什么它不合适。