【发布时间】: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