委托一个函数,其参数是本机类型的指针
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.
我在混合使用 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.