2009-04-08 45 views
8

Tôi đã xây dựng một DLL trong C#. Bây giờ tôi muốn sử dụng R Environment để gọi các hàm trong DLL đó. Môi trường R hỗ trợ gọi không được quản lý của C/C++ DLL nhưng không vào .NET DLL. Vì vậy, câu hỏi của tôi là, tôi có thể gọi các chức năng trong một C# DLL từ một C/C + + DLL? Nếu có, bạn có liên kết đến thông tin về cách thực hiện việc này không?Bạn có thể gọi một C# DLL từ một DLL C?

Trả lời

9

Cách thuận tiện nhất để làm điều này là để lộ một trong các lớp C# trong C# DLL của bạn dưới dạng đối tượng COM, sau đó tạo một thể hiện của nó từ tệp C/C++ DLL của bạn. Nếu đó không phải là một tùy chọn có thể chấp nhận được, bạn cần phải tạo một tệp DLL C++ hỗn hợp (có chứa cả mã được quản lý và không được quản lý). DLL C/C++ của bạn có thể gọi các hàm được xuất ra trong DLL chế độ hỗn hợp của bạn, có thể chuyển tiếp các cuộc gọi đến lớp C# của bạn.

+0

Đó là chế độ hỗn hợp C++ DLL âm thanh như nó sẽ làm các trick - Tôi đã chỉ có một cái nhìn tại các mẫu có sẵn để tạo ra một chế độ hỗn hợp DLL dự án sử dụng VS2008 nhưng không nhìn thấy một. Làm thế nào bạn sẽ đi về bắt đầu từ một chế độ hỗn hợp DLL? – Guy

+0

Nếu bạn tạo một thư viện lớp C++ mới, tạo ra một dự án C++ .NET DLL. Miễn là cài đặt "Hỗ trợ Runtime ngôn ngữ chung" được đặt thành "Hỗ trợ thời gian chạy ngôn ngữ chung (/ clr)", bạn được tự do sử dụng cả mã được quản lý và không được quản lý trong dự án. – Andy

0

Nó thực sự khá dễ dàng. Chỉ cần sử dụng NuGet để thêm gói "UnmanagedExports" vào dự án .Net của bạn. Xem https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports để biết chi tiết.

Sau đó, bạn có thể xuất trực tiếp mà không phải thực hiện lớp COM. Đây là mẫu C# code:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Text; 
using System.Threading.Tasks; 
using RGiesecke.DllExport; 

class Test 
{ 
    [DllExport("add", CallingConvention = CallingConvention.Cdecl)] 
    public static int TestExport(int left, int right) 
    { 
     return left + right; 
    } 
} 

R sẽ có thể tải TextExport giống như một dll C thông thường.

Các vấn đề liên quan