我有一些代码用来从一个字节数组得到一个结构:为什么我不能使用Marshal.Copy()更新结构?
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,得到一个指针,将一些字节复制到由此指向的内存中,返回。 不仅如此,但是当我使用类似的代码,但与d是T的数组,它工作正常。 除非sh.AddrOfPinnedObject()不是真的指向d
,但那又有什么意义呢?
有谁能告诉我为什么上述不起作用?
出于好奇,什么是“正确”的方式? – Dmitry 2012-12-28 17:29:01
@Dmitry,嗨,正确的方法是使用PtrToStructure()将指针传递给包含结构内容的非托管内存,如下所示:http://msdn.microsoft.com/en-us/library/4ca6d5z7.aspx 使用反射器可以看出PtrToStructure()实例化一个新的对象并填充它,虽然它如何做它我不确定,因为我相信这些细节是在我看不到的CLR(http://stackoverflow.com/questions/11788625/pinvoke-win32-function-for-marshal-ptrtostructure-in-silverlight-5) – sebf 2012-12-29 12:17:57