【发布时间】:2025-12-21 12:30:12
【问题描述】:
我有一些代码打算从字节数组中获取结构:
public static T GetValue<T>(byte[] data, int start) where T : struct
{
T d = default(T);
int elementsize = Marshal.SizeOf(typeof(T));
GCHandle sh = GCHandle.Alloc(d, GCHandleType.Pinned);
Marshal.Copy(data, start, sh.AddrOfPinnedObject(), elementsize);
sh.Free();
return d;
}
但是,d 结构永远不会被修改,并且总是返回其默认值。
我已经查找了执行此操作的“正确”方法并正在使用该方法,但我仍然很好奇,因为我不明白为什么上述方法不起作用。
它尽可能简单:分配一些内存,d,获取指向它的指针,将一些字节复制到 this 指向的内存中,然后返回。
不仅如此,而且当我使用类似的代码但 d 是 T 的数组时,它可以正常工作。
除非 sh.AddrOfPinnedObject() 并不是真正指向d,但那有什么意义呢?
谁能告诉我为什么上述方法不起作用?
【问题讨论】:
-
出于好奇,什么是“正确”的方式?
-
@Dmitry,嗨,正确的方法是使用 PtrToStructure() 传递指向包含结构内容的非托管内存的指针,如下所述:msdn.microsoft.com/en-us/library/4ca6d5z7.aspx 使用反射器可以看到 PtrToStructure()实例化一个新对象并填充它,虽然我不确定它是如何做到的,因为我认为这些细节在我看不到的 CLR 中 (*.com/questions/11788625/…)
标签: c# .net marshalling managed