c# - 在 C# 中编码(marshal) IntPtr 数组

标签 c# c marshalling

我想从 C# 中安全的托管代码调用 C API 中的函数,该函数接收指针数组 (void**)。

我有相应的 IntPtr 对象托管数组,但 MSDN 文档中宣传的 Marshal 方法似乎不足以向具有正确内容的非托管内存块提供 IntPtr。

我曾希望通过“Marshal.AllocHGlobal”获得一个 IntPtr,然后使用“Marshal.Copy”分配正确的内容,但似乎函数没有为 IntPtr 数组重载。

对实现此目的的最佳方式有何想法?

提前致谢。

最佳答案

P/Invoke 编码器已经完成了这项工作,您无需提供帮助。只需将函数参数声明为数组:

[DllImport("blah.dll")]
private static extern void SomeFunction(IntPtr[] array);

以防万一:虽然您不必在此处使用 unsafe 关键字,但它没有任何安全之处。当 C 代码写入超过您分配的 block 末尾时,它很容易破坏堆。

关于c# - 在 C# 中编码(marshal) IntPtr 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2595365/

相关文章:

c - 快速排序代码出错但未在错误窗口中显示

c# - 进行字节级操作的最干净的方法是什么?

c# - 在不注册 DLL 的情况下通过 ComInterop 在 C# 中编码(marshal)非托管 dll

c# - 如何在 C# 中覆盖 List<T> 的 Add 方法?

c# - 在 C# 中使用枚举作为状态返回状态指示器

c# mysql - 已经有一个与此连接关联的打开的数据读取器,必须先将其关闭

c - C 中的 For 循环循环次数超出了应有的次数。为什么?

c - 将函数中声明的局部数组传递给另一个函数

java - jaxb 编码器 characterEscapeHandler

c# - 如何跟踪窗口窗体的崩溃?