2010-08-06 31 views
6

Tôi đang cố gắng để gọi hàm sau C++ đó là gói lên thành một DLL:Làm thế nào bạn có thể So sánh một mảng byte trong C#?

unsigned char * rectifyImage(unsigned char *pimg, int rows, int cols) 

tuyên bố nhập khẩu của tôi trông giống như sau:

[DllImport("mex_rectify_image.dll")] 
unsafe public static extern IntPtr rectifyImage(
byte[] data, int rows, int columns); 

Và thói quen gọi tôi trông giống như sau:

byte[] imageData = new byte[img.Height * img.Width * 3]; 
// ... populate imageData 
IntPtr rectifiedImagePtr = rectifyImage(imageData, img.Height, img.Width); 
Byte[] rectifiedImage = new Byte[img.Width * img.Height * 3]; 
Marshal.Copy(rectifiedImagePtr, rectifiedImage, 0, 3 * img.Width * img.Height); 

Tuy nhiên, tôi tiếp tục nhận được một lỗi runtime:

Trường hợp ngoại lệ đầu tiên của loại System.AccessViolationException xảy ra trong xxx.dll Đã cố gắng đọc hoặc ghi bộ nhớ được bảo vệ. Đây thường là dấu hiệu cho thấy rằng bộ nhớ khác bị hỏng.

Tôi chỉ tự hỏi nếu lỗi nằm trong cách tôi marshaling dữ liệu của tôi hoặc trong tập tin DLL nhập khẩu của tôi ... bất cứ ai có bất kỳ ý tưởng?

+0

Bạn có thể muốn xem câu hỏi này: http://stackoverflow.com/questions/289076/how-can-i-pass-a-pointer-to-an-array-using- p-invoke-in-c – Bobby

+1

Giá trị trả về từ 'rectifyImage' có được giải phóng không, và nếu có thì làm thế nào? –

+0

Giá trị trả về cho rectifyImage được sử dụng để tạo đối tượng C# Bitmap và sau đó được giải phóng. Tôi đã không nhận được xung quanh để cố gắng tìm ra cách để thực sự miễn phí nó được nêu ra. – Tim

Trả lời

2

Điều này có thể xảy ra do quy ước gọi của phương thức không giống như trình so khớp được đoán là như vậy. Bạn có thể chỉ định quy ước trong thuộc tính DllImport.

Bạn không cần từ khóa 'không an toàn' trong khai báo C# ở đây vì nó không phải là mã 'không an toàn'. Có lẽ bạn đã thử nó với một con trỏ 'cố định' tại một thời điểm và quên để loại bỏ các từ khóa không an toàn trước khi gửi bài?

1

không chắc chắn nếu đây là vấn đề của bạn, nhưng nói chung C++ con trỏ ánh xạ tới IntPtr. vì vậy, hãy thử sửa đổi tuyên bố nhập của bạn về điều này:

[DllImport("mex_rectify_image.dll")] 
unsafe public static extern IntPtr rectifyImage(
IntPtr pData, int rows, int columns); 
+0

không chắc chắn lý do tại sao tôi nhận được bình chọn xuống, nhưng tôi đã dành thời gian để trả lời này vì vậy tôi muốn ít nhất mong đợi một bình luận về lý do tại sao câu trả lời của tôi không theo ý thích của bạn! bạn đã thực sự thử đề xuất của tôi và nó đã không hoạt động? –

0

rectifyImage Đang tìm kiếm một người tìm kiếm một byte thứ nhất trong khối dữ liệu bạn đang gửi trong khối. Thử imageData [0]

+0

Điều đó sẽ không hoạt động, vì marshaller sẽ chuyển một bản sao của byte đầu tiên, thay vì tham chiếu của nó. Vì vậy, bạn phải sử dụng mã không an toàn để thực hiện điều đó và chuyển '& imageData [0]' thay vì chỉ 'imageData [0]'. – Luaan

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