我是一名 C++ 开发人员,所以我对 C# 没有太多经验,但是无论如何我都必须解决这个问题。
有一个使用一些 C++ DLL 的 C# GUI。从 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 ,但这也不起作用。