c# - 我想从 C++ 非托管代码调用 C# 委托(delegate)。无参数委托(delegate)工作正常,但带参数的委托(delegate)使我的程序崩溃

标签 c# c++ pinvoke marshalling unmanaged

以下是来自未管理的 dll 的函数代码。它接受一个函数指针作为参数,并简单地返回被调用函数返回的值。

extern __declspec(dllexport) int  _stdcall callDelegate(int (*pt2Func)());
extern __declspec(dllexport) int  _stdcall callDelegate(int (*pt2Func)())
{
    int r = pt2Func();
    return r;
}

在托管 C# 代码中,我使用委托(delegate)调用上面的 umanged 函数。

  unsafe public delegate int mydelegate( );

    unsafe public int delFunc()
    {
             return 12;
    }

    mydelegate d = new mydelegate(delFunc);
    int re = callDelegate(d);
   [DllImport("cmxConnect.dll")]
    private unsafe static extern int callDelegate([MarshalAs(UnmanagedType.FunctionPtr)] mydelegate d);

这一切都很好!但是如果我想让我的函数指针/委托(delegate)接受参数,它会使程序崩溃。 因此,如果我按如下方式修改代码,我的程序就会崩溃。

修改后的非托管 C++ -

extern __declspec(dllexport) int  _stdcall callDelegate(int (*pt2Func)(int));
extern __declspec(dllexport) int  _stdcall callDelegate(int (*pt2Func)(int))
{
    int r = pt2Func(7);
    return r;
}

修改后的 C# 代码 -

unsafe public delegate int mydelegate( int t);

        unsafe public int delFunc(int t)
        {
                 return 12;
        }

        mydelegate d = new mydelegate(delFunc);
        int re = callDelegate(d);

最佳答案

函数指针的调用约定错误。让它看起来像这样:

 int (__stdcall * pt2Func)(args...)

关于c# - 我想从 C++ 非托管代码调用 C# 委托(delegate)。无参数委托(delegate)工作正常,但带参数的委托(delegate)使我的程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3374433/

相关文章:

c# - pinvoke - 传递一个字符串 [] 作为输出参数

c# - 通过引用传递的参数使用 P/Invoke 返回垃圾

c# - 控件应该在 ViewModel 中吗?

c++ - Visual C++ 2010 - fatal error LNK1169 : one or more multiply defined symbols found

c++ - 是否存在序列化 boost::signals2 信号调用的现有方法?

c++ - QThread 总是留下一个线程

c# - Pinvoke DeviceIoControl 参数

c# - 如何在 C# 中使用 XmlSerializer 将字节数组序列化为 XML?

c# - 嵌套文档上的 MongoDb TTL 是可能的吗?

c# - 使用数据库创 build 置文件