Tôi có một hệ thống khá lớn được triển khai trong C++ tôi cần tương tác với. Hệ thống có một API khá lớn, một số C++ DLL. Các DLL này xuất các lớp C++, trái ngược với một API kiểu C đẹp. và tôi cần sử dụng chúng từ dự án C# mới.Cách gọi API C++ từ C#
Từ những gì tôi biết .NET có ba cách để tương tác với phần mềm bản địa:
- P/Invoke - mà chỉ hoạt động trên C API
- COM đối tượng
- C++/CLI
Vì vậy, theo cách tôi hiểu, tôi có ba cách tiếp cận tương ứng:
- Viết trình bao bọc trong C và gọi nó bằng P/Gọi. dường như quá nhiều công việc.
- Viết trình bao bọc bằng COM. mà tôi không biết làm thế nào để làm, và trừ khi nó cực kỳ dễ dàng, tôi miễn cưỡng tìm hiểu những gì dường như với tôi - một công nghệ hấp hối.
- Viết trình bao bọc trong C++/CLI. mà dường như công việc ít nhất, mặc dù vẫn còn rất nhiều.
Câu hỏi của tôi:
Trước hết tôi muốn biết tại sao không .NET cho phép tôi chỉ đơn giản là sử dụng ++ lớp C "nguyên trạng"? Tôi cho rằng đó là vấn đề về bộ nhớ quản lý . và nếu tôi sẵn sàng viết finalizers, và triển khai IDisposable. Từ những gì tôi biết các lớp C++ chỉ là cấu trúc thực sự ưa thích, và vì P/Invoke hỗ trợ cấu trúc và các hàm lấy cấu trúc làm thông số đầu tiên, tại sao không hỗ trợ các lớp ?
Thứ hai, giả sử tôi thực sự lười biếng và rất nhiều công việc nhàm chán, tẻ nhạt, tẻ nhạt, công việc , cách tốt nhất để sử dụng các tệp DLL này là gì? một khả năng để gọi chúng trực tiếp từ C# sẽ là tốt nhất. Nếu không thì tôi muốn yêu một công cụ tự động để tạo trình bao bọc. Ngoài ra, các tệp DLL có thể thay đổi , có thể, chỉ một chút nhưng vẫn còn, id thay vì không bị ép buộc để tự viết lại trình bao bọc.
Đối với một câu trả lời thực sự tốt, đặc biệt là trên phần đầu, hoặc một công cụ tự động tốt, tôi sẽ thưởng cho một tiền thưởng ...
Cảm ơn bạn
1. Bởi vì khác nhau DLL có quy ước gọi khác nhau. –
http://stackoverflow.com/questions/2120690/tool-for-creating-net-wrappers-for-a-com-dll –
Tôi nghĩ C++/CLI sẽ tốt. Tôi không chính xác có kinh nghiệm làm điều này với xuất khẩu C + +, mặc dù. – chris