【发布时间】:2010-11-22 01:34:46
【问题描述】:
我尝试以这种方式分配结构数组:
struct T {
int a; int b;
}
data = Marshal.AllocHGlobal(count*Marshal.SizeOf(typeof(T));
...
我想访问分配的数据,将结构“绑定”到分配的数组中的每个元素 与 AllocHGlobal... 类似的东西
T v;
v = (T)Marshal.PtrToStructure(data+1, typeof(T));
但我没有找到任何方便的方法... 为什么 IntPtr 缺少算术?如何以“安全”的方式解决此问题?
有人可以确认 PtrToStructure 函数将数据复制到 struct 变量中吗?也就是说,修改struct是否反映了结构数组数据的修改?
当然,我想使用struct对IntPtr指向的数据进行操作,而不是每次都复制数据,避免不安全的代码。
谢谢大家!
【问题讨论】:
-
PtrToStructure 复制数据。如果您发现自己不得不做这种事情,请编写一个非托管库并 p/invoke 它。
-
也许您想解释一下为什么要从非托管内存中使用一组值开始。您可以创建一个托管数组并将其来回编组为非托管代码。你也说“安全”,但这是否意味着标记为不安全的代码是不可能的,或者你只是说你不想犯错误?
-
我正在为 OpenGL 实现缓冲区对象抽象。分配的数据可能包含顶点、法线......我虽然使用 AllocHGlobal 分配内存并管理数据布局,但没有放弃我的实现提供的语义。一个例子是 glVertexPointer:它需要一个缓冲区地址和有关内存布局的信息。我可以在不复制数据的情况下将 T[] 转换为 IntPtr(直接通过 IntPt 使用数组内存)吗?
标签: c# marshalling intptr