Có lẽ cách tốt nhất để đi ở đây là sử dụng P/Invoke hoặc nền tảng Gọi. Tùy thuộc vào cấu trúc hoặc giao diện dll C++ bạn có thể muốn bọc nó trong một giao diện C thuần túy; nó là dễ nhất nếu giao diện của bạn chỉ sử dụng các loại blittable. Nếu bạn giới hạn giao diện dll của bạn thành các loại blittable (Int32, Single, Boolean, Int32 [], Single [], Double [] - khái niệm cơ bản), bạn sẽ không cần phải thực hiện bất kỳ việc điều chỉnh phức tạp dữ liệu giữa được quản lý (C#) và không được quản lý (C) không gian bộ nhớ.
Ví dụ: trong mã C# của bạn, bạn xác định các cuộc gọi có sẵn trong dll C/C++ bằng thuộc tính DllImport.
[DllImport, "ExactDllName.dll"]
static extern boolean OneOfMyCoolCRoutines([In] Double[] x, [In] Double[] y, [Out] Double result)
Ít [In] và [Out] không bắt buộc, nhưng chúng có thể tăng tốc. Bây giờ bạn đã thêm "ExactDllName.dll" của bạn làm tham chiếu đến dự án C#, bạn có thể gọi hàm C/C++ từ mã C# của bạn.
fixed(Double *x = &x[0], *y = &y[0])
{
Boolean returnValue = OneOfMyCoolCRoutines(x, y, r);
}
Lưu ý rằng tôi về cơ bản sẽ chuyển con trỏ ngược lại và thứ tư giữa dll và mã C# của tôi. Điều đó có thể gây ra lỗi bộ nhớ vì các vị trí của các mảng đó có thể được thay đổi bởi bộ thu gom CLR, nhưng C/C++ sẽ không biết gì về nó. Vì vậy, để bảo vệ chống lại điều đó, tôi đã chỉ đơn giản là cố định những con trỏ trong C# của tôi, và bây giờ họ sẽ không di chuyển trong bộ nhớ trong khi dll của tôi đang hoạt động trên các mảng. Đây là mã không an toàn và tôi sẽ cần biên dịch mã C# của tôi với cờ đó.
Có nhiều chi tiết tinh tế để tương tác với ngôn ngữ, nhưng điều đó sẽ giúp bạn phát triển. Gắn bó với giao diện C không trạng thái của các loại blittable là một chính sách tuyệt vời nếu có thể. Điều đó sẽ giữ mã ngôn ngữ interop của bạn sạch sẽ nhất.
Chúc may mắn,
Paul
bạn đã xem xét thêm một giao diện COM? Kể từ đó, IMHO, thông qua các đối số và dữ liệu chương trình với các thùng chứa COM có thể là giải pháp. –