我收到 PInvokeStackImbalance:'检测到 PInvokeStackImbalance 消息:对 PInvoke 函数“ConvertedClass::MapViewOfFile”的调用使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。'
我对 DLL 的使用相当陌生,今天刚刚完成了一些教程。
如有任何帮助,我们将不胜感激。
using System.Runtime.InteropServices;
//dll
[DllImport("kernel32", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
public static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject, FileMapAccessRights dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, ulong dwNumberOfBytesToMap;)
string szSharedMemory = "FUNKY_BUSINESS";
//other dll call is successful and returns value
IntPtr hMem = OpenFileMapping(FileMapAccessRights.Write, FALSE, szSharedMemory);
///BOOM.. not this one
IntPtr pvHead = MapViewOfFile(hMem, FileMapAccessRights.Write, 0, 0, 0);
编辑:这是一个糟糕的论点。第 5 个参数应该是 UIntPtr 而不是 ulong。 this is how i feel right now
最佳答案
最后一个参数是SIZE_T
。这是无符号的,在 32 位进程中为 32 位,在 64 位进程中为 64 位。所以最好的解决方案是使用 UIntPtr
作为最终参数。
我会使用以下内容:
[DllImport("kernel32")]
public static extern IntPtr MapViewOfFile(
IntPtr hFileMappingObject,
FileMapAccessRights dwDesiredAccess,
uint dwFileOffsetHigh,
uint dwFileOffsetLow,
UIntPtr dwNumberOfBytesToMap
);
您的代码使用始终为 64 位宽的 ulong
。您的进程是一个 32 位进程,这解释了为什么 P/invoke 编码器检测到堆栈不平衡。
关于c# - C# 中的 DLLImport 调用不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10709799/