gpt4 book ai didi

c# - 在 .NET 4 中使用 IntPtr 时出现 PInvokeStackImbalance 异常? (适用于 .NET 3.5)

转载 作者:太空狗 更新时间:2023-10-30 00:08:19 26 4
gpt4 key购买 nike

这可能是个菜鸟问题,但在过去的几个小时(或几天)里它一直让我感到困惑...

我在 .NET Framework 4.0 的代码中从 DLL 调用方法

  [DllImport("xeneth.dll")]
public static extern ErrorCode XC_GetFrame(Int32 h, FrameType type, ulong ulFlags, IntPtr buff, uint size);

然后在这里使用它:

if (XC_GetFrame(myCam, XC_GetFrameType(myCam), 0, IntPtr.Zero, (uint)fs) != ErrorCode.E_NO_FRAME)

但是,当我在 .NET 4.0 中运行此程序时,出现 P/INVOKE 错误,但是...在 3.5 中运行此程序不会触发此错误。在我和另一个程序员检查了代码之后,我们似乎将其归结为在 4.0 上以不同方式运行的 IntPtr。

我的应用程序需要在 .NET 4.0 中运行,因为应用程序所需的一些功能仅在 4.0 中可用 ...

是否有任何我可能忽略或忘记包含的内容?

非常感谢任何想法!

汤姆

更新:

本地声明:

virtual ErrCode XCamera::GetFrame(FrameType type, unsigned long ulFlags, void *buffer, unsigned int size)

错误:对 PInvoke 函数“DLLTest!DLLTest.Form1::XC_GetFrameType”的调用使堆栈失衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。

最佳答案

造成这种情况的两个常见原因:

  1. 调用约定不匹配。您的 C# 代码使用默认的 stdcall。也许 native 代码使用 cdecl。尝试将 CallingConvention=CallingConvention.Cdecl 添加到 DllImport 属性。
  2. 参数列表不匹配(见下文)。

不要自欺欺人地说您的代码没问题,因为 .net 3.5 不会引发此错误。 .net 4 中的错误检测更好,这就是为什么您只能在那里看到错误的原因。但是您的代码在所有 .net 版本中都已损坏。


C++ 虚方法的原生定义是:

virtual ErrCode XCamera::GetFrame(FrameType type, unsigned long ulFlags, 
void * buffer, unsigned int size);

看起来您正在将对象指针作为 pinvoke 调用中的第一个参数传递。我认为这可行,尽管我不太了解导出时如何处理虚函数以了解这是否是一个问题。大概您已经导出了一个普通的 C 函数来实例化对象。

我看到的另一个问题是,在 Windows 上,C/C++ long 是 32 位。 C# long 是 64 位。这意味着 ulFlags 的正确声明是 C# 代码中的 uint

关于c# - 在 .NET 4 中使用 IntPtr 时出现 PInvokeStackImbalance 异常? (适用于 .NET 3.5),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9897863/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com