繁体   English   中英

C ++ / CLI使用抽象方法继承本机C ++类并将其公开给C#

[英]C++/CLI Inheriting from a native C++ class with abstract methods and exposing it to C#

我一直在谷歌搜索试图找到一个完全成熟的例子,但无济于事。

我有一个C ++ API,它提供了许多包含纯虚方法的类,供开发人员使用。 我试图做的是通过C ++ / CLI为C#提供这个接口。

我已经设法将API编译到C ++ / CLI库中,因为我是新手,所以我已经达到了一个难点。

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

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

希望有人可以帮忙!

Sammich

使用Hans Passant发布的链接中的代码作为基础,以下是我认为您正在寻找的内容。 它不会像这样编译,因为我写了这个例子'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(); 
    }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM