【发布时间】:2014-01-10 22:19:16
【问题描述】:
我有一个类定义如下:
[StructLayout(LayoutKind.Sequential)]
public class OUR_MEM_STR
{
public byte[] p;
public int len;
};
这是下面 C 结构的等效定义:
typedef struct
{
void *p;
int len;
} OUR_MEM_STR;
我对成员 p 使用了 byte[] 而不是 IntPtr 类型,因为它在整个 c# 项目中都被使用了。
我定义了一个 len = 10 和 p = new byte[10] 的对象 obj
我想把它变成一个 intptr。我如何获得对象的大小?
IntPtr pObj = Marshal.AllocHGlobal(obj.len + sizeof(int));
Marshal.StructureToPtr(obj, pObj, true);
看看我在那里做了什么。它似乎太难编码了。如果我执行以下 sn-p;
IntPtr pObj = Marshal.AllocHGlobal(Marshal.SizeOf(obj));
这样做会返回错误的大小,因为 obj.p 返回的大小是 4 而不是 10。因为指向字节数组的指针占用的内存是 4 个字节。
有没有更好的办法?
【问题讨论】:
-
你能告诉我们你试图复制的结构的 C 定义吗?
-
@JaredPar,我编辑了这个问题
-
所以,如果我这样做 IntPtr pObj = Marshal.AllocHGlobal(Marshal.SizeOf(obj));并且使用false参数,应该没问题吧?
-
太酷了,它做到了。当我将结构写入 ptr 函数时,智能提示告诉我使用 true。他们让新开发者感到困惑
标签: c# class marshalling intptr