我正在使用混合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%)'匹配。”
我试图改变我的代表的定义,但没有任何成功。
在这样的方法上制作委托的正确语法是什么?
答案 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的核心原因。在构造函数中分配,在析构函数和终结器中销毁。