2011-10-02 27 views
8

Tôi có một dự án C# đang sử dụng một dll C++. (trong visual studio 2010)

Tôi phải truyền một mảng int từ mã C# tới hàm C++ và hàm C++ sẽ thêm vài phần tử vào mảng, khi điều khiển quay lại mã C#, mã C# cũng sẽ thêm các phần tử trong cùng mảng . Ban đầu tôi tuyên bố một mảng (kích thước 10000) trong mã C# và mã C++ có thể thêm phần tử (vì nó chỉ là một mảng int, cấp phát bộ nhớ giống nhau), nhưng vấn đề là tôi đã gặp lỗi thời gian chạy do truy cập bên ngoài mảng.

Làm thế nào để vượt qua mảng C# tới C++ và trả về C# với các mục bổ sung?

Tôi có thể tăng kích thước lên 100000 nhưng một lần nữa tôi không biết có bao nhiêu phần tử mã C++ sẽ thêm (thậm chí nó có thể chỉ là 1 phần tử).

Vì vậy, có cấu trúc dữ liệu chung (mảng động) tồn tại cho cả hai hoặc cách khác để thực hiện? Tôi đang sử dụng Visual studio 2010.

Một cái gì đó như thế này tôi muốn làm.
PS: không được biên dịch mã, và ở đây tôi sử dụng mảng char thay vì mảng int.

C# code

[DllImport("example1.dll")] 
private static extern int fnCPP (StringBuilder a,int size) 
... 

private void fnCSHARP(){ 
    StringBuilder buff = new StringBuilder(10000); 
    int size=0; 
    size = fnCPP (buff,size); 
    int x = someCSHARP_fu(); 
    for (int i=size; i < x+size; i++) buff[i]='x';// possibility of run time error 
} 

C++

int fnCPP (char *a,int size){ 
    int x = someOtherCpp_Function(); 
    for(int i=size; i < x+size ; i++) a[ i ] = 'x'; //possibility of run time error 
    return size+x; 
} 
+0

Hiển thị cho chúng tôi mã số –

+2

Bạn có thể sử dụng C++/CLI không? Bạn có thể sử dụng C++/CLI không? –

+2

Bạn không thể "thêm" các mục vào một mảng. Mảng được cố định kích thước. Sử dụng cấu trúc dữ liệu khác hoặc thay đổi cách bạn giao tiếp giữa hai cấu trúc này. –

Trả lời

3

Có một bài viết MSDN tốt về đi qua mảng giữa quản lý và không được quản lý đang Here. Câu hỏi là, tại sao bạn cần phải vượt qua mảng từ C# đến C++ ở nơi đầu tiên? Tại sao bạn không thể thực hiện phân bổ ở phía C++ (trong phương thức fnCPP của bạn), và trả về một con trỏ tới mã C#, và chỉ sử dụng Marshal.Copy(source, destination, 0, size) như trong yet another Stackoverflow question? Hơn trong phương thức fnCSHARP của bạn, bạn có thể sao chép nội dung của mảng vào một số cấu trúc dữ liệu chiều dài có thể biến đổi (ví dụ: Danh sách).

+3

Nếu bạn cấp phát bộ nhớ trong C++ và trả về C#, bạn cần phải chuyển con trỏ trở lại C++ để giải phóng bộ nhớ. Trình thu gom rác .NET không thể giúp bạn ở đây. –

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