Tôi có struct này và mã này:lỗi Non-blittable trên một loại blittable
[StructLayout(LayoutKind.Sequential, Pack = 8)]
private class xvid_image_t
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public int[] stride;
// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
// public IntPtr[] plane;
}
public int decore()
{
xvid_image_t myStruct = new xvid_image_t();
myStruct.stride = new int[4]; // can be commented out - same result
GCHandle.Alloc(myStruct, GCHandleType.Pinned);
// ...
}
Khi tôi cố gắng chạy nó tôi nhận được một ArgumentException
nói:
Object chứa phi nguyên thủy hoặc dữ liệu không blittable
Sau khi đọc this MSDN page nói
Các loại phức tạp sau đây cũng là loại blittable:
mảng
Một chiều các loại blittable, chẳng hạn như một mảng các số nguyên. Tuy nhiên, một loại có chứa một mảng biến của các loại blittable không phải là chính nó blittable.
Loại giá trị được định dạng chỉ chứa các loại blittable (và các lớp nếu chúng được so khớp dưới dạng các loại được định dạng). Để biết thêm thông tin về các loại giá trị được định dạng, hãy xem Marsharsh mặc định cho các loại giá trị.
Tôi không hiểu mình đang làm gì sai. Tôi không chỉ muốn sử dụng Marshal
mà còn phải hiểu điều này.
Vì vậy, những gì tôi thực sự muốn là phải biết:
- Tại sao?
- Tôi làm cách nào để giải quyết vấn đề này?
- Giải pháp bạn cung cấp cũng có hoạt động với dòng nhận xét trong cấu trúc không?
Tôi đang sử dụng .Net 4.5 nhưng cũng cần có giải pháp cho .Net 2.0.
+1 - tuyệt vời giải thích, Hans! – JerKimball