Tôi có một số mã nhằm có được một cấu trúc từ một mảng byte:Tại sao tôi không thể sử dụng Marshal.Copy() để cập nhật cấu trúc?
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;
}
Tuy nhiên, cấu trúc d
không bao giờ thay đổi, và luôn luôn trả về giá trị mặc định của nó.
Tôi đã tra cứu cách 'đúng' để thực hiện việc này và đang sử dụng thay vào đó, nhưng tôi vẫn tò mò, vì tôi không thể thấy lý do tại sao điều này không hoạt động.
Nó đơn giản như có thể là: cấp phát một số bộ nhớ, d, có được một con trỏ đến nó, sao chép một số byte vào bộ nhớ chỉ bằng cách này, trở về. Không chỉ vậy, nhưng khi tôi sử dụng mã tương tự nhưng với d là một mảng của T, nó hoạt động tốt. Trừ khi sh.AddrOfPinnedObject() không thực sự trỏ đến d
, nhưng sau đó điểm của nó là gì?
Bất cứ ai có thể cho tôi biết lý do trên không hoạt động?
Chỉ cần tò mò là cách 'chính xác' là gì? – Dmitry
@ Dmitry, Xin chào, cách chính xác là sử dụng PtrToStructure() chuyển một con trỏ tới bộ nhớ không được quản lý có chứa nội dung của cấu trúc như được mô tả chi tiết tại đây: http://msdn.microsoft.com/en-us/library/4ca6d5z7.aspx Sử dụng phản xạ nó có thể được nhìn thấy PtrToStructure() instantiates một đối tượng mới và populates nó, mặc dù nó như thế nào tôi không chắc chắn vì những chi tiết tôi tin là trong CLR mà tôi không thể nhìn thấy (http://stackoverflow.com/questions/11788625/pinvoke-win32-function-for-marshal-ptrtostructure-in-silverlight-5) – sebf