我有一个包装一些本机代码的C ++ / cli类库。一切都很好,我正在为测试和使用示例编写C#代码。其中一个C ++方法对文件进行处理(可能需要一些时间),因此我想使用回调函数向C#调用者报告进度。我在C ++库中声明了一个委托,如下所示:
public delegate int ProcListCB(int state, int status, long count);
以及使用库从代码设置委托的函数,如下所示:
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)'没有重载匹配委托'AccuMailCoreVerifySq.ProcListCB'
我已经搜索了一段时间,但我没有找到答案(显然)。我假设有一些函数调用约定不匹配,但我不知道细节。任何帮助将不胜感激......
答案 0 :(得分:2)
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类型。)< / p>
public delegate System::Int32 ProcListCB(
System::Int32 state, System::Int32 status, System::Int64 count);