通过 cli 包装器在 c# 中调用 c++ 代码

Call c++ code in c# by a cli wrapper

我有一个 c++ 代码需要在 c# 中由 cli 包装器调用。我卡在运算符重载部分了。

//这是我的代码 //Cppclass.h

#ifdef CPP_EXP_EXPORTS
#define CPP_EXP __declspec(dllexport)
#else
#define CPP_EXP __declspec(dllimport)
#endif

 class CPP_EXP Cppclass;
 CPP_EXP Cppclass  operator-(Cppclass const &, Cppclass const &);
 class CPP_EXP Cppclass
 {
 public:
 friend CPP_EXP Cppclass operator-(Cppclass const &, Cppclass const &);
 };

//这是我的托管 C++ 代码。

#include "Cppclass.h"

   namespace Wrapper
 {

    public ref class cppwrapclass
    {
      public:
       static cppwrapclass ^ operator-(cppwrapclass%A,cppwrapclass%B)
         {
            operator-(A.obj,B.obj);
            return gcnew cppwrapclass();
         }
      private:
        Cppclass *obj;
    };
 }

它显示了一个智能感知错误并且没有被编译。

你这样写一个包装器:

public ref class cppwrapclass
{
public:
    cppwrapclass(Cppclass *obj)
        : obj(obj)
    {
    }

    ~cppwrapclass()
    {
        this->!cppwrapclass();
    }

    !cppwrapclass()
    {
        if (obj)
        {
            delete obj;
            obj = nullptr;
        }
    }

    static cppwrapclass^ operator-(cppwrapclass% A, cppwrapclass% B)
    {
        return gcnew cppwrapclass(new Cppclass(*A.obj - *B.obj));
    }

private:
    Cppclass* obj;
};

A.objCppclass* 类型,因此 *A.objCppclass 类型,而 *A.obj - *B.obj 是临时 Cppclass 需要被移动到堆中以便被包装器引用,因此复制构造函数调用:new Cppclass(*A.obj - *B.obj).

剩下的是 Dispose 模式和终结器管道代码。