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.
Có lẽ 'MarshalAs' là thứ bạn đang tìm kiếm? – atlaste
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]. –