我是C++开发人员,所以我没有太多的C#经验,但是,我必须解决这个问题。只有在调试时System.ExecutionEngineException
有一个C#GUI使用一些C++ DLL。从其中一个DLL调用某个方法时,会发生System.ExecutionEngineException。显然,我不能进入C++代码,看看这段代码是否有问题。所以我建立了一个小型的C++测试应用程序,并且这个工作正常。在C#代码中调用该方法的参数对我来说也很好(在我的C++测试应用程序中使用了相同的值)。尽管在GUI中可能存在或可能不存在与此问题相关的问题,但在没有Visual Studio的情况下启动相同的可执行文件就很好。
我目前不知道如何找出导致问题的原因。任何提示将不胜感激。
调用C#代码中的方法,其中caseID的类型为int,paramID的类型为System.Int32,paramData为自定义结构。
getParameter(caseID, dataID, paramID, ref paramData)
在C#代码的方法的签名如下所示:
[ DllImport ("helper.dll", CallingConvention=CallingConvention.Cdecl/*, CharSet = CharSet.Auto*/)]
public static extern ERROR getParameter(System.Int32 caseID, System.Int32 dataID, System.Int32 paramID, ref PARAMETER_DATA data);
在C++ DLL相应方法的签名如下:
ERROR _stdcall getParameter(const long caseID, const long dataID, long number, PARAMETER_DATA *data);
是什么对我来说很奇怪的是,C++代码明确指出该方法应该用调用约定“stdcall”来调用,而C#代码要使用Cdecl。但是,这段代码似乎已经运行了很长一段时间了。我也尝试将两个调用约定都改为stdcall,但这也不起作用。
您的C++代码正在破坏GC堆。有很多机会通过* data *参数来做到这一点。召唤大会神秘肯定也不是好兆头。 –
是的,我已经在想这个了。我最初的怀疑是,由于C++代码的变化,结构不同步,但到目前为止我找不到任何区别。我目前的问题是,C++代码本身工作正常,但是当我调试我的C#应用程序时,我立即在调用方法时遇到此问题。我不知道如何找出究竟发生了什么问题...... – sigy