如何在C++/cli中声明委托并在C#中使用它

3

我有一个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);
        ...
    }

我遇到了编译错误:

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

我搜索了一段时间,但还没有找到答案(显然)。 我猜想是某个函数调用约定不匹配,但我不知道具体细节。 希望能得到任何帮助...


一个 C++ 的 long 并不够长,你可能需要使用 long long。它更长 :) - Hans Passant
1个回答

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类型。)
public delegate System::Int32 ProcListCB(
    System::Int32 state, System::Int32 status, System::Int64 count);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接