Tôi đã cố gắng tạo một xử lý cho một kiểu cấu trúc vì tôi cần một con trỏ được ghim vào nó, nhưng tôi gặp lỗi "Object chứa non-primitive or non- dữ liệu blittable "Làm cách nào để phân bổ GCHandle cho cấu trúc khi cấu trúc chứa bool
cấu trúc của tôi trông như thế này:
[StructLayout(LayoutKind.Sequential)]
public struct MyStruct
{
[MarshalAs(UnmanagedType.U1)]
public bool Test;
}
Bây giờ, khi tôi gọi,
var mystruct = new MyStruct();
var handle = GCHandle.Alloc(mystruct, GCHandleType.Pinned);
tôi nhận được lỗi" Object chứa dữ liệu phi nguyên thủy hoặc không blittable ". Bây giờ tôi hiểu rằng trường bool là một kiểu không thể blittable. Nhưng tôi đã có ấn tượng rằng bằng cách thêm thuộc tính MarshalAs, tôi có thể nói với marshaller cách chuyển đổi kiểu. (Tôi cũng đã thử UnmanagedType.Bool
)
Cấu trúc này phải được xác định trên toàn cầu, bởi vì nó là cần thiết trong suốt lớp học của tôi. Lý do duy nhất tôi cần con trỏ là bởi vì tôi có một API không được quản lý phải vượt qua cấu trúc này như một con trỏ. Sau đó, tôi phải lấy cấu trúc đó trong một cuộc gọi lại và đọc/cập nhật thành viên.
Vì vậy, đây là kịch bản cơ bản.
- Cấu trúc được tạo ra trên toàn cầu trong một lớp học quản lý
- Con trỏ trỏ tới cấu trúc thu được
- Con trỏ trỏ tới cấu trúc được truyền vào API
- API gọi một phương thức callback tĩnh nơi tôi sau đó cần phải nhận được cấu trúc của tôi và đọc/cập nhật thành viên.
Tôi cố gắng sử dụng Marshal.StructureToPtr
nhưng điều này chỉ tạo bản sao, vì vậy nếu trong lớp được quản lý tôi cập nhật thành viên, khi gọi lại được nâng lên, giá trị cập nhật không có.
Có ai biết cách tôi có thể lấy con trỏ được ghim vào cấu trúc của mình để tôi có thể đọc/sửa đổi các thành viên công khai và yêu cầu họ có sẵn trong cuộc gọi lại không?
Cảm ơn
đây là danh sách các loại blittable http://msdn.microsoft.com/en-us/library/75dwhxf7.aspx – Mayank