C# 回调 C++函数

Kiven 2013-12-09 12:51:53
最近遇到一个非常棘手的问题,都到最后一步了,还出错,请高手指点

我想用C++写底层,C#写界面。采用C#调用C++函数,有些网络事件需要回调处理,所以用了C++的函数指针和C#的委托。我的程序能够调用完成,但是就是最后的时候崩掉了,我查看堆栈程序停在C++函数的末尾,应该是函数调用结束出栈报错。提示Run-Time Check Failure #0。网上看了很多资料,说的是C++导出和C#调入约定不一致,问题是我设置的肯定是一至的啊。下面是程序的相关代码,往高人指点,感激不尽!


C++代码

#ifndef STRUCTMOD_EXPORT
#define STRUCTMOD_EXPORT extern "C" __declspec(dllexport)
#endif

typedef void (*PFunTest)(INT32 iN);

STRUCTMOD_EXPORT void __stdcall CallerDll(PFunTest pfnTest);

void __stdcall CallerDll(PFunTest pfnTest)
{
if (pfnTest)
{
(*pfnTest)(10);
}
//就在这里,函数出栈时出错了!
}


C#代码
public delegate void TestD(Int32 iN);
public static TestD t;
[DllImport("CDll", EntryPoint = "CallerDll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
private static extern void CallerDll(TestD t);
private void button1_Click(object sender, EventArgs e)
{
t = new TestD(Test);
CallerDll(t);
}

public void Test(Int32 iN)
{
MessageBox.Show(iN.ToString());//显示没有问题 弹出对话框 显示 10
}
...全文
116 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kiven 2013-12-10
  • 打赏
  • 举报
回复
感谢大家的参与,特别谢谢LargeSkyMensk,你的答案是正确的!
bigbaldy 2013-12-09
  • 打赏
  • 举报
回复
又看了一下,确定了,C#的函数调用方式都是stdcall,返回时都是ret xxh, 而C里默认是cdecl
bigbaldy 2013-12-09
  • 打赏
  • 举报
回复
这句

typedef void (*PFunTest)(INT32 iN);
改为

typedef void (__stdcall *PFunTest)(INT32 iN);
largeskymengsk 2013-12-09
  • 打赏
  • 举报
回复
Run-Time Check Failure #0 ?这个错误信息是不完全的吧? 记得在委托上指明调用约定:
        [System.Runtime.InteropServices.UnmanagedFunctionPointer(System.Runtime.InteropServices.CallingConvention.Cdecl)]
        public delegate void TestD(Int32 iN);
宝_爸 2013-12-09
  • 打赏
  • 举报
回复
是不是函数指针的声明也要用__stdcall 例如 typedef void (__stdcall LOG)(const char* sErr); 以上代码来自,lz可以参考: http://social.msdn.microsoft.com/Forums/vstudio/en-US/660123f8-83e2-43b5-a2de-db96fbdc2f98/pinvoke-c-callback-from-c

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧