mam jakiś kod przeznaczony dostać struct z tablicy bajtów:Dlaczego nie mogę użyć Marshal.Copy() do aktualizacji struct?
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;
}
Jednak struktura d
nigdy nie jest modyfikowany, a zawsze zwraca jego wartość domyślną.
Sprawdziłem "prawidłowy" sposób, aby to zrobić i używam tego zamiast tego, ale jestem nadal ciekawy, ponieważ nie rozumiem, dlaczego powyższe nie powinno działać.
Jest to tak proste, jak to tylko możliwe: przydziel trochę pamięci, d, zdobądź do niej wskaźnik, skopiuj kilka bajtów do pamięci wskazanej przez to, return. Co więcej, , ale kiedy używam podobnego kodu, ale d jest tablicą T, działa dobrze. O ile sh.AddrOfPinnedObject() naprawdę nie wskazuje na d
, ale jaki jest tego sens?
Czy ktoś może mi powiedzieć, dlaczego powyższe nie działa?
Po prostu z ciekawości, jaki był "właściwy" sposób? – Dmitry
@Dmitry, Hi, poprawną metodą jest użycie PtrToStructure() przekazując wskaźnik do niezarządzanej pamięci zawierającej zawartość struktury, jak to opisano tutaj: http://msdn.microsoft.com/en-us/library/4ca6d5z7.aspx Korzystanie z reflektora jest widoczne PtrToStructure() tworzy nowy obiekt i zapełnia go, ale jak to działa Nie jestem pewien, ponieważ te szczegóły, które moim zdaniem są w CLR, których nie widzę (http://stackoverflow.com/questions/11788625/pinvoke-win32-function-for-marshal-ptrtostructure-in-silverlight-5) – sebf