2013-01-14 31 views
1

我是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,但这也不起作用。

+0

您的C++代码正在破坏GC堆。有很多机会通过* data *参数来做到这一点。召唤大会神秘肯定也不是好兆头。 –

+0

是的,我已经在想这个了。我最初的怀疑是,由于C++代码的变化,结构不同步,但到目前为止我找不到任何区别。我目前的问题是,C++代码本身工作正常,但是当我调试我的C#应用​​程序时,我立即在调用方法时遇到此问题。我不知道如何找出究竟发生了什么问题...... – sigy

回答

0

问题是,在C++中是一个char []的struct成员改变了它的大小。在C#代码中有这个属性

[MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=11)] 

所以我不得不改变SizeConst属性的值。不知道为什么我没有看到这个时,我第一次检查结构的差异...

我也修复了调用约定的问题,现在一切似乎工作正常。