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

时间:2016-07-27 19:17:59

标签: c# delegates c++-cli

我有一个包装一些本机代码的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'

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

1 个答案:

答案 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);