【发布时间】:2021-12-30 14:20:18
【问题描述】:
我有一个 IntPtr,它是一个指向结构数组的指针,我正在尝试将它转换为数组。
我试过了
Marshal.Copy(srcIntPtr, destIntPtrArray, 0, destIntPtrArray.Length);
但是在进行复制之后,我无法将目标数组中的 IntPtr 转换为所需的结构,而我可以将 srcIntPtr 转换为结构,这当然只会给我第一个索引的数据. 看起来在复制之后,目标数组包含一堆损坏的 IntPtr
我也试过
var size = Marshal.SizeOf(Marshal.ReadIntPtr(myIntPtr));
for (int i = 0; i < length; i++)
{
IntPtr iP = new IntPtr(myIntPtr.ToInt64() + i * size);
MyStruct ms =
(MyStruct ) Marshal.PtrToStructure(iP, typeof(MyStruct ));
}
这不会引发任何错误,但是我从源 IntPtr 中获取的结构数组的数据不准确。
这是我要转换的结构
struct MyStruct
{
public Categories categories;
public Dimensions dimensions;
}
public struct Categories {
public double d;
public double c;
public double b;
public double a;
}
struct Dimensions {
public double v;
public double e;
}
我在结构顶部有[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)],但删除它不会破坏我的代码。
提前致谢
【问题讨论】:
-
你能显示结构的声明吗?
-
亲爱的@Sean 我刚刚编辑了我的问题。 c++ 库中结构的声明与 c# 中的相同。可以毫无问题地将
IntPtr转换为单个结构 -
澄清一下:您已尝试将 Marshall.Copy 复制到 IntPtr[] 数组,然后循环到 Marshal.Copy 该 IntPtr[] 中的每个项目并且结构已损坏/不完整?
-
@JacobShanley 不,我将
IntPtr复制到IntPtr[],然后循环通过IntPtr[]并尝试Marshal.PtrToStructure他们每个人。但它在循环开始时抛出一个异常,并说Object reference is not set to an object (unknown wrapper)基本上是一个空异常。我应该更新问题吗? -
Marshal.ReadIntPtr(myIntPtr) 读取数组大小不太可能是正确的。问题中没有任何提示告诉我们如何获取数组大小。 C 数组声明从来都不是问题,我们看不到任何读取相同数组的示例 C 代码。
标签: c# .net marshalling intptr unmanaged-memory