C ++ / CLI从本地C ++类抽象方法继承和将其暴露于C#(C++/CLI Inheritin

2019-08-22 13:47发布

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

我有一个C ++ API,它提出了许多包含用于显影剂从延伸纯虚方法类。 我正在试图做的是通过C ++ / CLI提供此接口为C#。

我设法编译到C ++ / CLI库中的API,我已经到了一个关键点,因为我是新来的这一点。

我知道,我需要创建一个包装到C ++ / CLI非托管类暴露在托管的.NET类,但我还没有发现,展示了如何用一个抽象的C ++类做了坚实的例子和讨论。

任何人都可以点我在正确的方向,以一个完整的例子包括C#测试应用程序,显示年底到如何创建包装为一个抽象类结束。 这似乎是一个“哦,你只是做X”的事情,但我不能找出X是什么:)。 我已经看到了这里的几个例子,但他们也不是很清楚。 因为我解决任何C#它已经3年左右。

希望有人能帮助!

Sammich

Answer 1:

在使用由Hans帕桑特公布为基地的链接代码,以下是我认为你正在寻找。 它不会编译这样的,因为我写了这个例子“内联” - 把所有的方法实现在.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(); 
    }
};


文章来源: C++/CLI Inheriting from a native C++ class with abstract methods and exposing it to C#