c# - C++/CLI 使用抽象方法从 native C++ 类继承并将其公开给 C#

标签 c# c++ .net interop c++-cli

我一直在谷歌上四处搜索,试图找到一个完整的例子,但无济于事。

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

我已经设法将 API 编译到 C++/CLI 库中,但由于我是新手,所以遇到了困难。

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

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

希望有人能帮忙!

萨米奇

最佳答案

使用 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(); 
    }
};

关于c# - C++/CLI 使用抽象方法从 native C++ 类继承并将其公开给 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15981835/

相关文章:

c# - 如何在 Excel Interop C# 中读取日期时间

c# - 在多线程服务器应用程序中访问 SQL DB

c# - 使用使用不同编译器编译的 DLL

javascript - 将 ViewData 值从 Controller 传递到 View

C++ View 类型 : pass by const& or by value?

C# WPF 将系统颜色设置为按钮

c++ - 如何根据引用进行 regex_replace

c++ - 为什么 boost.log 在 Windows XP 上会崩溃?

C# 返回工厂默认值

c# - 什么表现更差 : Reflection or Boxing?