2015-06-06 18 views
6

Tôi đang gọi hàm không được quản lý trong mã C# của tôi.Nguyên soái [In] [Out] Các thuộc tính

Việc kê khai của chức năng này là như sau:

int myFun(unsigned char* inputBuffer, unsigned char* &outputBuffer); 

tôi sử dụng chức năng này như sau:

[DllImport("myDLL.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern int myFun([In] byte[] inputBuffer, out IntPtr outputBuffer); 

byte[] a = Encoding.ASCII.GetBytes("sampletext!"); 
IntPtr b; 
res = myFun(a, out b); 

Mặc dù tôi đã đề cập [InAttribute] cho byte[] inputBuffer, chức năng vẫn changeds các giá trị của a. Có vẻ như CLR đang sử dụng hành vi marshaling mặc định của riêng nó. Tôi đã sử dụng byte[] vì nó tương đương C# cho unsigned char*.

Khi tôi thay thế byte[] bằng char[] CLR sẽ theo các thuộc tính In-Out của tôi.

Tôi đánh giá cao sự giúp đỡ của bạn. Để biết thêm thông tin, vui lòng đọc số msdn page này.

+0

Có lẽ 'MarshalAs' là thứ bạn đang tìm kiếm? – atlaste

+1

Trình khắc phục sự cố pinvoke chỉ sao chép dữ liệu khi cần. Nó không phải với byte [], nó chỉ ghim mảng và chuyển một con trỏ tới phần tử đầu tiên. Vì vậy, mã gốc là tiệc tùng trực tiếp trên mảng được quản lý. Rất hiệu quả. Khác với char [], các phần tử phải được chuyển đổi từ giá trị 16 bit thành giá trị 8 bit. Bạn sẽ nhận được các giá trị Encoding.Default. Các marshaller pinvoke * phải * sao chép, nó sẽ không sao chép lại mà không có [Out]. –

Trả lời

8

Từ documentation, với sự nhấn mạnh của tôi:

Là một tối ưu hóa, mảng của các loại blittable và các lớp học có chứa chỉ các thành viên blittable được gắn thay vì sao chép trong marshaling. Các loại này có thể xuất hiện để được sắp xếp như các tham số Vào/Ra khi người gọi và callee ở trong cùng một căn hộ. Tuy nhiên, các kiểu này thực sự được sắp xếp như các tham số Trong, và bạn phải áp dụng các thuộc tính InAttribute và OutAttribute nếu bạn muốn sắp xếp đối số dưới dạng tham số Vào/Ra.

byte là blittable, mảng byte của bạn được ghim chứ không phải sao chép và do đó nguyên soái là In/Out.

Khi tôi thay thế byte [] bằng char [] CLR sẽ theo các thuộc tính In-Out của tôi.

Loại C# charnot blittable. Một mảng của char không được ghim và do đó, [In] char[] nguyên soái làm tham số Trong.

+0

* C# loại char không phải là blittable. * Nếu anh ta sử dụng Charset Unicode? – xanatos

+0

@xanatos Liên kết tài liệu trong danh sách câu trả lời của tôi 'System.Char' là không thể blittable –

+0

@David Heffernan, cảm ơn rất nhiều vì câu trả lời của bạn. Bài viết này cũng hữu ích. https://msdn.microsoft.com/en-us/library/23acw07k%28v=vs.110%29.aspx –

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