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
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.
Bài viết này có thể giúp bạn ra ngoài:
Cập nhật: Có một công cụ gọi là mergebin rằng tàu với .NET SQLite wrapper bạn có thể sử dụng để tạo ra một chế độ hỗn hợp tự nhiên/DLL quản lý. Lấy mã nguồn từ:
SQLite for ADO.NET 2.0 (SourceForge)
Bạn sẽ tìm thấy exe trong thư mục bin\tools
.
Kev
Cảm ơn bạn đã liên kết Kev - đọc thú vị. – Guy
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.
- 1. Gọi C DLL từ C#
- 2. Gọi một dll c từ C++, C# và ruby
- 3. Gọi C++ dll từ Java
- 4. Gọi lại C# từ DLL
- 5. Gọi C++ DLL từ Python
- 6. Gọi C# dll từ Java
- 7. chức năng Gọi từ một C++ DLL trong Delphi
- 8. Gọi hàm delphi DLL từ C# Code
- 9. Cách gọi hàm C# DLL từ VBScript
- 10. Có thể gọi một DLL được quản lý từ C++ không được quản lý?
- 11. Nhúng dll không được quản lý vào một C# dll
- 12. Tham khảo một DLL từ một DLL khác
- 13. Làm dll Fortran và gọi nó từ C#
- 14. Không thể tìm thấy một điểm vào khi gọi C++ dll trong C#
- 15. Làm thế nào để có được một mô tả lỗi std :: ngoại lệ khi gọi một C++ dll từ C#
- 16. Tôi có thể chạy một C# lắp ráp (dll) như 32bit từ một ứng dụng 64bit?
- 17. Hiệu suất của việc gọi Unmanaged .dll từ C#
- 18. Gọi lại từ Delphi dll đến C# app
- 19. Python có thể gọi hàm Delphi trong một DLL không?
- 20. Gọi Delphi DLL từ C++ \ CLI với nhiều thông số
- 21. Sử dụng một DLL có tiêu đề .h trong C++
- 22. Tự động P/Gọi một DLL
- 23. Tạo một DLL từ MATLAB
- 24. Chức năng xuất từ C++ dll sang C# P/Invoke
- 25. Thêm C++ DLL vào dự án C#
- 26. Lấy tên của một DLL từ bên trong dll
- 27. truyền một chuỗi các chuỗi từ C# đến một dll C++ và ngược lại
- 28. Tạo một DLL trong C và liên kết nó từ một dự án C++
- 29. C# LPT inpout32.dll
- 30. Có thể lắp ráp C# .dll có điểm vào không?
Đó 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
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