8

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

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

我已经设法将 API 编译到 C++/CLI 库中,并且由于我是新手,所以我已经达到了一个症结所在。

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

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

希望有人能帮忙!

萨米希

4

1 回答 1

8

使用 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(); 
    }
};
于 2013-04-13T12:08:39.220 回答