运行时检查失败#0仅执行被调用函数内的函数

时间:2015-01-08 11:45:32

标签: c# c++ runtime-error dllimport ipopt

在我的c#代码中,我需要调用由我创建的dll导出的c ++函数( myWrapper )。

myWrapper 返回时,我收到以下运行时错误:

  

运行时检查失败#0 - ESP的值未在函数调用中正确保存。这通常是调用使用一个调用约定声明的函数的结果,函数指针使用不同的调用约定声明。

正如我将在下面展示的那样,我已经将调用约定指定为__cdecl。

详细说明,我的C#代码:

class myClass
{
    [DllImport("MyWrapper.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern void myWrapper();

    public void myMethod()
    {
        myWrapper();
    }
}
myWrapper 的c ++代码:

#include "IpIpoptApplication.hpp"

extern "C" __declspec(dllexport) void (__cdecl myWrapper)()
{
    SmartPtr<IpoptApplication> solver = IpoptApplicationFactory();
    ApplicationReturnStatus status = solver->Initialize();  
}

IpoptAppliationFactory 函数是从 IpOptApplication.hpp 中的外部dll导入的(它是开源项目的一部分,可以从https://projects.coin-or.org/svn/Ipopt/stable/3.11/Ipopt/src/Interfaces/IpIpoptApplication.hpp查看)用这一行:

extern "C" __declspec(dllexport) class Ipopt::IpoptApplication * __cdecl IpoptApplicationFactory();

奇怪的是,只有在调用 myWrapper 中的&#34; solver-&gt; Initialize()&#34; 时才会发生错误。如果我评论对此方法的调用 myWrapper 会返回没有错误。 问题与&#34; Ipopt :: IpoptApplication&#34;的定义无关,也与IpoptApplicationFactory()或Initialize()的实现无关,因为1)它们来自一个众所周知的开源项目({{3}成千上万的程序员使用,2)如果在用c ++代码编写的独立可执行文件中使用,myWrapper可以正常工作。

我已经用Google搜索了几个小时,我认为问题出在我调用 myWrapper 的方式,但我无法找到解决方案。

有人能给我一些建议吗?非常感谢。

罗伯特

1 个答案:

答案 0 :(得分:0)

感谢Hans Passant,问题已经解决了。我必须编译&#34; myWrapper&#34;在发布模式。

IPOPT DLLS只能在RELEASE MODE中编译(参见随IpOpt dll分发的readme.txt)!我已经将配置管理器设置为始终在发布模式下编译该项目(即使解决方案处于调试阶段)。 要调试myWrapper函数(调用IpOpt dll),必须在我的StartUp项目的属性中设置,复选框&#34;启用非托管代码调试&#34; 由于非托管代码调试不允许在调试期间修改代码,因此如果我不需要调试myWrapper,我会继续这样做。

我希望这会有所帮助