2009-08-06 42 views
7

Bạn có một cấu trúc mà phải mất một mảng byteMarshalling một kích thước mảng chưa biết

byte[] 

Tuy nhiên, kích thước của mảng mà phụ thuộc vào hình ảnh bạn đang nộp (WIDTHxHEIGHT)

Vì vậy, ... làm thế nào bạn có làm

[MarshalAs(UnmanagedType.ByValArray, SizeConst = ???)] 
public Byte[] ImageData; 

Sizeconst PHẢI CÓ khi làm việc với mảng byte được truyền từ C# đến C dll?

+0

Trình chỉnh sửa tùy chỉnh có vẻ như là lựa chọn duy nhất. – IllidanS4

Trả lời

2

Bạn cần thay đổi loại marshalling. SizeConst là cần thiết nếu bạn đang marshalling như ByValArray, nhưng không phải với các loại khác. Để biết chi tiết, hãy xem UnmanagedType enum.

nghi ngờ của tôi là bạn muốn marshall như một con trỏ C đến mảng:

[MarshalAs(UnmanagedType.LPArray)] 

Điều này sẽ gây ra nó để marshall qua đến một mảng C chuẩn (BYTE *), vì vậy chỉ một con trỏ được truyền xuyên qua. Làm điều này cho phép bạn vượt qua bất kỳ mảng có kích thước nào. Thông thường, bạn cũng sẽ muốn đi qua kích thước mảng như một tham số khác (hoặc chiều rộng/chiều cao/bpp của hình ảnh, cung cấp cùng một thông tin), vì không có cách nào trong C/C++ để nói dễ dàng.

+0

Cảm ơn Reed đã trả lời. Tuy nhiên, tôi đã làm điều đó và bây giờ nhận được lỗi này Kết hợp loại không được quản lý/không được quản lý (Các trường mảng phải được ghép nối với ByValArray hoặc SafeArray) Khi xây dựng IntPtr và sau đó Marshal.StructureToPtr ... Suy nghĩ? – Olewolfe

+0

Kiểm tra enum. Sẽ cần thêm thông tin. Tôi đã giả định bạn đang marshalling từ quản lý -> unmanaged, nhưng nếu bạn đang đi theo cách khác xung quanh, bạn có thể hoặc Marhsal nó như là một IntPtr (thay vì một byte []) hoặc thiết lập nó để sử dụng một SafeArray. –

+1

Thật không may bằng cách sử dụng bất cứ điều gì nhưng [MarshalAs (UnmanagedType.ArrayByVal, sizeConst = xxxx)] làm rối loạn địa chỉ bộ nhớ. Vì vậy, về cơ bản có một cấu trúc (có chứa một byte []) mà cần phải được chuyển đổi sang một IntPtr để nó có thể được truyền cho DLL. Và dữ liệu trong byte [] đang trở nên rối tung lên. Xác minh điều này bằng cách sao chép dữ liệu từ IntPtr đến một byte [] và xem xét dữ liệu để thấy rằng mọi thứ được thay đổi trừ khi tôi đã thiết lập MarshalAs trong cấu trúc. – Olewolfe

Các vấn đề liên quan