我是C ++开发人员,所以我对C#没有多少经验,但是,无论如何,我必须解决这个问题。
有一个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 :(得分:0)
问题是在C ++中作为char []的struct成员改变了它的大小。在C#代码中有这个属性
[MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=11)]
所以我不得不改变SizeConst属性的值。当我第一次检查结构的差异时,不知道为什么我没有看到这个......
我还修复了调用约定问题,现在一切似乎都正常。