gpt4 book ai didi

c# - 委托(delegate)一个函数,其参数是 native 类型的指针

转载 作者:行者123 更新时间:2023-11-30 21:55:44 26 4
gpt4 key购买 nike

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

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

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

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

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

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

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

但我收到编译错误 (C3352),提示“指定的函数与委托(delegate)类型‘void (double %,double %)’不匹配。”

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

在这种方法上进行委托(delegate)的正确语法是什么?

最佳答案

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

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

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

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

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

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

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

关于c# - 委托(delegate)一个函数,其参数是 native 类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31988732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com