c# - C# 中的 DLLImport 调用不正确

标签 c# .net dll pinvoke

我收到 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/

相关文章:

c# - MVC5 Ninject 绑定(bind)和 HttpContext

c# - 并非所有程序集都从 bin 文件夹加载到 AppDomain

c# - 从 try/catch 返回值的正确方法

asp.net - 洋葱架构标识框架

c# Generics - 意外的性能结果

c# - "yield return"更紧凑的方式?

c# - 从字典中获取第一个元素

c# - SqlCeConnection 处理中的访问冲突异常

browser - 在 Inno Setup 中嵌入 Internet Explorer 窗口(Web 浏览器控件)

windows - 在 GAC 中注册 DLL(CMD 或 PowerShell)