【问题标题】:System.ExecutionEngineException only when debuggingSystem.ExecutionEngineException 仅在调试时
【发布时间】:2012-12-28 10:00:39
【问题描述】:

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

【问题讨论】:

  • 您的 C++ 代码正在破坏 GC 堆。通过 data 参数有很多机会这样做。调用约定之谜肯定也不是好兆头。
  • 是的,我已经想到了。我最初的怀疑是由于 C++ 代码的更改导致结构不同步,但到目前为止我找不到任何区别。我当前的问题是 C++ 代码本身工作正常,但是当我调试我的 C# 应用程序时,我在调用该方法时立即遇到了这个问题。我不知道如何找出到底出了什么问题......

标签: c# c++ debugging exception dll


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-10-01
    • 2011-01-02
    • 1970-01-01
    • 2010-11-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2018-11-10
    相关资源
    最近更新 更多