委托一个函数,其参数是本机类型的指针

Delegate on a function with an argument being a pointer on a native type

我在混合使用 C# 和 C++-CLI 的应用程序中工作,我对 C++-CLI 的语法不是很熟悉。

在这个应用程序中,我有一个获取位置的方法,在 C++-CLI 模块中定义:

public ref class MyBigClass
{
    MyClassA m_myobject;
    // plenty of things
    void GetPosition(double &dPosX, double &dPosY);
};

现在,在另一个 C# 模块中,我想用这个方法创建一个委托。我尝试了以下语法:

public delegate void OnGetPositionHandler(ref double X, ref double X);
public class MyClassA
{
    //...
    public event OnGetPositionHandler OnGetPosition;
}

在第二个 C++-CLI 文件中,我这样创建委托:

m_myobject->OnGetPosition += gcnew OnGetPositionHandler(this, &MyBigClass::GetMotionPos);

但是我得到一个编译错误 (C3352),说 "the specified function does not match the delegate type 'void (double %,double %)'."

我试图更改我的委托的定义,但没有成功。

在这种方法上创建委托的正确语法是什么?

does not match the delegate type 'void (double %,double %)`

错误消息给了你一个巨大的提示,你必须用 % 而不是 & 声明参数,这样它们就可以作为托管指针而不是本机指针传递。修复:

   void GetPosition(double% dPosX, double% dPosY);

您通常 运行 遇到的下一个问题是您的本机 C++ 代码需要本机指针。您无法将托管指针转换为本机指针,编译器会阻止您开枪。当垃圾收集器在压缩堆时移动 double 并且本机代码写回到 double 曾经所在的位置时,会产生致命伤。这样做会破坏 GC 堆。

修复需要为本机代码提供值的稳定地址。样板是:

void MyBigClass::GetPosition(double% dPosX, double% dPosY) {
   double x, y;
   m_myobject->GetPosition(&x, &y);
   dPosX = x;
   dPosY = y;
}

否则,这也是编译器通常坚持要求您将 m_myobject 声明为 MyClass* 而不是 MyClass 的核心原因。在构造函数中分配,在析构函数中销毁 and finalizer.