最近再编写C#与C++双向交互的程序。
昨天解决了一个程序的bug,但是原理不清楚,望大神指点。
具体Bug:C#调用C++动态库的一个函数(如A),函数中做了很多C++与C#双向交互的工作,方法执行全部没有问题,其中双向调用的函数也都执行完毕,但是在A函数返回跳到C#后,跳下述错误:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
如果继续执行,会导致整个计算机系统崩溃。
解决办法:将C++ Code Generation中的Basic Runtime Checks 设为 Default。如此更改后,程序运行完全正常,后续代码运行正常,多次调用函数A也没有问题。
疑问:后续查了一下关于这个属性的定义,是不进行ESP检查。可是ESP是函数出入前后栈的检查,如果栈出错,按说程序无法回到原代码区,怎么会简单修改一个check属性后就可执行通过。另外为什么会出现check不通过的现象。
备注:非stdcall问题