2013-04-04 47 views
14

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:

  1. P/Invoke - mà chỉ hoạt động trên C API
  2. COM đối tượng
  3. 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:

  1. 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.
  2. 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.
  3. 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:

  1. 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 ?

  2. 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

+0

1. Bởi vì khác nhau DLL có quy ước gọi khác nhau. –

+2

http://stackoverflow.com/questions/2120690/tool-for-creating-net-wrappers-for-a-com-dll –

+0

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

Trả lời

6

Nếu bạn sẵn sàng đi theo cách lười biếng, tôi sẽ đề nghị sử dụng một công cụ để tạo C# wrapper cho các lớp C++ của bạn. Và tất nhiên công cụ để tạo ra một wrapper như là SWIG

Để biết thêm thông tin, xem câu trả lời cũ của tôi để similar question

+0

Tôi chấp nhận câu trả lời của bạn cho đề xuất SWIG. mặc dù chúng tôi đã kết thúc bằng cách sử dụng P/Gọi đến một Wrapper C. –

0

Con đường tôi hiểu nó, trong C++, các quy ước gọi cho các phương thức trong các lớp khá lộn xộn. Ở cấp độ tệp .LIB được sử dụng bởi trình liên kết, tên hàm được "trang trí" (xem ví dụ: Name mangling). Ngoài ra, bố trí của các biến lớp trong bộ nhớ có lẽ là khác nhau giữa tất cả các triển khai khác nhau của C++ so với C#, đó là lý do tại sao Interop Marshaling là một chủ đề lớn. Vì vậy, tôi đoán là Microsoft đánh giá rằng có quá nhiều vấn đề cấp thấp, và do đó quá khó, để làm cho nó xứng đáng.

Tôi đã sử dụng cả hai đối tượng P/Invoke và COM để liên kết C# của tôi với C++, nhưng tôi chưa sử dụng C++/CLI. Tôi đã tham gia vào COM trong nhiều năm, và nó rất giống với ngôn ngữ riêng của nó.Vì vậy, nếu bạn đã không bao giờ thực hiện bất kỳ COM Tôi nghĩ rằng bạn đang đúng rằng nó không phải là giá trị học nó ở giai đoạn này. Nếu một C++/CLI sẽ cho phép bạn giao tiếp với các đối tượng, thay vì phải ép mọi thứ thông qua giao diện C, thì tôi nghĩ bạn đúng rằng nó sẽ là tuyến đường tốt nhất.