1

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

4

1 回答 1

0

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

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

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

我还修复了调用约定问题,现在一切正常。

于 2013-01-18T15:10:11.197 回答