【发布时间】:2012-03-27 21:19:57
【问题描述】:
可能是一个菜鸟问题,但在过去的几个小时(或几天)里,这让我陷入了困境......
我在 .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 中运行它不会触发这个错误。在我和另一位程序员检查了代码之后,我们似乎将其归结为 IntPtr 在 4.0 上的运行方式不同。
我的应用程序需要在 .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 签名的调用约定和参数是否与目标非托管签名匹配。
【问题讨论】:
-
XC_GetFrame的原生定义是什么,你遇到的具体错误是什么?
-
请解释您遇到了什么错误?
-
定义:虚拟 ErrCode XCamera::GetFrame(FrameType type, unsigned long ulFlags, void * buffer, unsigned int size) [纯虚拟] 错误是一个 PINVOKE Stack Imabalance: A call to PInvoke function ' DLLTest!DLLTest.Form1::XC_GetFrame' 使堆栈失衡。
-
您的代码在 .net 2 中已经有一个错误的导入签名,但该版本过于宽松,存在某些错误。 .net 4 更严格,暴露(而不是导致)错误。
标签: c# .net c#-4.0 c#-3.0 intptr