我在一些我已经使用了一段时间的东西上遇到了这个奇怪的错误。这可能是 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/