Có thể gọi mã C ++ từ C # không?


Câu trả lời:


90

Một cách dễ dàng để gọi vào C ++ là tạo một hợp ngữ trình bao bọc trong C ++ / CLI. Trong C ++ / CLI, bạn có thể gọi vào mã không được quản lý như thể bạn đang viết mã gốc, nhưng bạn có thể gọi vào mã C ++ / CLI từ C # như thể nó được viết bằng C #. Về cơ bản, ngôn ngữ này được thiết kế với khả năng tương tác vào các thư viện hiện có như một "ứng dụng sát thủ" của nó.

Ví dụ - biên dịch điều này bằng công tắc / clr

#include "NativeType.h"

public ref class ManagedType
{
     NativeType*   NativePtr; 

public:
     ManagedType() : NativePtr(new NativeType()) {}
     ~ManagedType() { delete NativePtr; }

     void ManagedMethod()
      { NativePtr->NativeMethod(); } 
}; 

Sau đó, trong C #, thêm một tham chiếu đến hợp ngữ ManagedType của bạn và sử dụng nó như vậy:

ManagedType mt = new ManagedType();
mt.ManagedMethod();

Kiểm tra bài đăng trên blog này để biết thêm một ví dụ được giải thích.


2
liên kết bị hỏng cho bài đăng trên blog :(
Vidar

9

Tôi không quen thuộc với thư viện mà bạn đã đề cập, nhưng nói chung có một số cách để làm như vậy:

  • P / Gọi đến các hàm thư viện đã xuất
  • Thêm một tham chiếu đến thư viện kiểu COM (trong trường hợp bạn đang xử lý các đối tượng COM).

9

P / Invoke là một công nghệ tốt và nó hoạt động khá tốt, ngoại trừ các vấn đề khi tải tệp DLL đích. Chúng tôi nhận thấy rằng cách tốt nhất để làm mọi việc là tạo một thư viện tĩnh gồm các hàm gốc và liên kết nó với một dự án Managed C ++ (hoặc C ++ / CLI) phụ thuộc vào nó.


Tôi đã gặp sự cố với lệnh gọi lại và lệnh gọi p /. Chuyển sang C ++ / CLI đã giải quyết được những vấn đề này.
MedicineMan


2

Chắc chắn là. Bài viết này là một ví dụ điển hình về việc bạn có thể làm để bắt đầu.

Chúng tôi thực hiện việc này từ C # trên các thiết bị Windows Mobile của mình bằng P / Invoke .


2

Công nghệ được sử dụng để làm điều này được gọi là P / Invoke ; bạn có thể tìm kiếm các bài báo về chủ đề này. Lưu ý rằng đó là để gọi C từ C #, không phải C ++ quá nhiều. Vì vậy, bạn sẽ cần bọc mã C ++ của mình trong một trình bao bọc C mà DLL của bạn xuất ra.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.