【问题标题】:Get pointer to unmanaged memory in C# from C++从 C++ 获取指向 C# 中非托管内存的指针
【发布时间】:2015-02-21 00:31:24
【问题描述】:

我得到了一个分配内存的 C++ DLL。它有几个函数需要我将指针传递给这个分配的内存。我在 C# 中工作,所以我需要保留这个指针,以便在需要时将它传递回 C++ DLL。指针永远不会在 C# 端使用,除非保留它以传递给 C++ 代码。

我宁愿不使用 unsafe 关键字。

我创建了一个 IntPtr 来传递给 C++ 函数以存储分配的内存地址,但它在 C++ 端立即崩溃 (AccessViolationException)。我不确定 DLL 调用的正确语法。

这是我正在尝试做的一个例子:

[DllImport("data_accessor.dll")]
public static extern void get_pointer_to_new_memory(IntPtr memory_ptr);

不使用unsafe 可以吗?如果有,怎么做?

更新: 对不起,我没有早点发布这个。这是我正在调用的函数。 (名称已更改以保护无辜者。)

typedef void* handle_ptr;
void DLL_API get_pointer_to_new_memory(handle_ptr* handle)

【问题讨论】:

  • IntPtr 是要走的路——你不需要unsafe。至于您的例外情况,请确保函数签名匹配,并且还请确保您使用的是正确的calling convention
  • 等待... 鉴于您示例中的函数名称,我希望是 IntPtr get_pointer_to_new_memory()void get_pointer_to_new_memory(out IntPtr memory_ptr)
  • 能否贴出实际c++函数的签名
  • 这种互操作就是匹配一个函数的两个版本。你只展示了一个。

标签: c# pointers pinvoke intptr


【解决方案1】:

感谢卢卡斯的评论,我得到了它的工作。我在正确的轨道上...只是缺少out 关键字。

[DllImport("data_accessor.dll")]
public static extern void get_pointer_to_new_memory(out IntPtr memory_ptr);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 2012-10-10
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多