gpt4 book ai didi

c# - 如何在 C++/cli 中声明委托(delegate)并在 C# 中使用它

转载 作者:行者123 更新时间:2023-11-30 16:48:01 33 4
gpt4 key购买 nike

我有一个包装了一些 native 代码的 C++/cli 类库。一切正常,我正在编写 C# 代码用于测试和使用示例。其中一种 C++ 方法对文件进行处理(可能需要一些时间),因此我想使用回调函数向 C# 调用方报告进度。我在 C++ 库中声明了一个委托(delegate),如下所示:

public delegate int ProcListCB(int state, int status, long count);

以及使用库从代码设置委托(delegate)的函数,如下所示:

public ref class MyClass
{
public:
void SetProcListCallback(ProcListCB ^ cb)
{
HouseKeeping::procListCallback = cb;
}
};

在 C# 中,我有以下内容:

    ProcListCB procListCB;

public int ProcessListCallback(int state,int status,long count)
{
int rtnVal = 0;
// some code...
return (rtnVal);
}

private void Process_Click(object sender, EventArgs e)
{
VerifySq vsq = new VerifySq();
ProcListCB cb = new ProcListCB(ProcessListCallback);
vsq.SetProcListCallback(cb);
...
}

我遇到编译错误:

错误 CS0123:'VerifySqListGui.MainWin.ProcessListCallback(int, int, long)' 的重载不匹配委托(delegate) 'AccuMailCoreVerifySq.ProcListCB'

我已经搜索了一段时间,但没有找到答案(显然)。我假设有一些函数调用约定不匹配,但我不知道细节。任何帮助将不胜感激...

最佳答案

public delegate int ProcListCB(int state, int status, long count);

如果您在 C++/CLI 中执行此操作,那么问题是 C++ 数据类型。 C++ int 有多大? 32 位。 C++ long 有多大?也是 32 位的。

由于您要与 C# 进行互操作,因此我将明确使用 C# 数据类型。 (是的,即使你有一个 using namespace System;,我仍然会在这一行使用 System::,以非常明显地表明你正在引用.Net 类型。)

public delegate System::Int32 ProcListCB(
System::Int32 state, System::Int32 status, System::Int64 count);

关于c# - 如何在 C++/cli 中声明委托(delegate)并在 C# 中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38621429/

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