委托函数使用参数作为本机类型的指针

时间:2015-08-13 12:48:41

标签: c# c++-cli

我正在使用混合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),说“指定的函数与委托类型'无效(double%,double%)'匹配。”

我试图改变我的代表的定义,但没有任何成功。

在这样的方法上制作委托的正确语法是什么?

1 个答案:

答案 0 :(得分:3)

  

与委托类型'void(double%,double%)`

不匹配

错误消息为您提供了一个巨大的提示,您必须使用%而不是&声明参数,以便将它们作为托管指针而不是本机指针传递。修正:

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

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

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

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

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