【问题标题】:Opaque pointers with PInvoke in C#在 C# 中使用 PInvoke 的不透明指针
【发布时间】:2013-11-27 20:51:52
【问题描述】:

我正在使用具有以下不透明句柄的第三方 C 库:

typedef struct _VendorHandle *VendorHandle;

这里是供应商的如何加载句柄的 C 示例:

VendorHandle handle;
int err;
err = vendorLoadFile(&handle, "something.bin");

我正在尝试使用以下声明在 C# 中使用 PInvoke 调用此方法:

[DllImport("VendorLib.dll")]
static extern int vendorLoadFile(IntPtr handle, string path);

然后我添加了以下代码来使用声明:

IntPtr handle = new IntPtr();
int code = vendorLoadFile(handle, path);

当我运行它时,我收到以下错误:

试图读取或写入受保护的内存。这通常是一个 指示其他内存已损坏。

我知道 DLL 很好,并且 PInvoke 正在工作,因为我正在执行他们的 vendorVersion() 方法,所以它必须是我做错的其他事情。

【问题讨论】:

    标签: c# pointers pinvoke


    【解决方案1】:

    该函数接受一个指向不透明句柄的指针,以便它可以将句柄写入指针指向的内存中。
    在 C# 术语中,这是一个out IntPtr

    [DllImport("VendorLib.dll")]
    static extern int vendorLoadFile(out IntPtr handle, string path);
    
    IntPtr handle;
    int code = vendorLoadFile(out handle, path);
    

    【讨论】:

    • 谢谢。我现在收到另一个错误:“对 PInvoke 函数 '[snip] vendorLoadFile' 的调用使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查调用约定和参数PInvoke 签名匹配目标非托管签名。"
    • 那么你按照消息告诉你的做了吗?
    • 好的,我克服了那个奇怪的错误。我只需要按照this StackOverflow answerCallingConvention = CallingConvention.Cdecl 添加到DllImport。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-02-12
    • 2011-01-28
    • 2011-07-15
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多