c# - 调用 PInvoke 函数 '[...]' 使堆栈不平衡

标签 c# c++ pinvoke unmanaged managed

我在一些我已经使用了一段时间的东西上遇到了这个奇怪的错误。这可能是 Visual Studio 2010 中的新事物,但我不确定。
我正在尝试从 C# 调用用 C++ 编写的未管理函数。
从我在互联网上阅读的内容和错误消息本身来看,这与我的 C# 文件中的签名与 C++ 中的签名不同这一事实有关,但我真的看不到它。
首先这是我下面的未管理功能:

TEngine GCreateEngine(int width,int height,int depth,int deviceType);

这是我在 C# 中的函数:

[DllImport("Engine.dll", EntryPoint = "GCreateEngine", CallingConvention = CallingConvention.StdCall)]  
        public static extern IntPtr CreateEngine(int width,int height,int depth,int device);

当我调试到 C++ 时,我看到所有参数都很好,因此我只能认为它与从 TEngine(它是一个名为 CEngine 的类的指针)到 IntPtr 的转换有关。我之前在VS2008中使用过这个没有问题。

最佳答案

我有一个 _cdecl c++ dll,我从 Visual Studio 2008 调用它时没有遇到任何问题,然后 Visual Studio 2010 中的相同代码将无法工作。我得到了同样的 PInvoke ...也有不平衡的堆栈错误。

我的解决方案是在 DllImport(...) 属性中指定调用约定: 来自:

[DllImport(CudaLibDir)] 

收件人:

[DllImport(CudaLibDir, CallingConvention = CallingConvention.Cdecl)]

我猜他们在 .NET 3.5 和 .NET 4.0 之间更改了 DLLImport 的默认调用约定?

关于c# - 调用 PInvoke 函数 '[...]' 使堆栈不平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2941960/

相关文章:

c++ - 指针和数组作为参数有什么区别?

c# - 从 C# 中的字符串解析多个 double

c# - 哪个更好?强制转换可为 null 的类型或使用 Value 属性检索值?

c# - 带有加载和表单模型的 MVC View

c++ - 降雨统计 C++

C++,dll的多个实例,单例

c# - 隐藏另一个应用程序的任务栏按钮

c# - 无法将结构从 C++ 返回到 C#

c# - 文本 block 在数据网格 WPF 中选择前景色

.net - 对同一托管 dll 中的 32 位和 64 位 dll 使用 pinvoke