Có thể gọi mã C ++, có thể được biên dịch dưới dạng tệp thư viện mã (.dll), từ bên trong ngôn ngữ .NET chẳng hạn như C # không?
Cụ thể, mã C ++ chẳng hạn như thư viện mạng RakNet.
Có thể gọi mã C ++, có thể được biên dịch dưới dạng tệp thư viện mã (.dll), từ bên trong ngôn ngữ .NET chẳng hạn như C # không?
Cụ thể, mã C ++ chẳng hạn như thư viện mạng RakNet.
Câu trả lời:
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.
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 / 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ó.
Vâng, nó được gọi là P / Invoke .
Đây là một trang web tài nguyên tuyệt vời để sử dụng nó với Win32 API:
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 .
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.
Bạn đã xem Apache Thrift chưa?
Nó có vẻ như là một giải pháp rất gọn gàng.