Я создал DLL на С#. Теперь я хочу использовать R Environment для вызова функций в этой DLL. Среда R поддерживает вызов неуправляемых библиотек DLL C/C++, но не .NET DLL. Итак, мой вопрос: могу ли я вызывать функции в C# DLL из C/C++ DLL? Если да, то есть ли у вас ссылка на информацию о том, как это сделать?
Вопрос
Можно ли вызвать C# DLL из C DLL?
- Возможный дубликат Вызов C# из C StayOnTarget 17.04.2018
Ответы
Ответ 1 · рейтинг 9 · Andy
Самый простой способ сделать это - представить один из классов C# в DLL C# как COM-объект, а затем создать его экземпляр из DLL C/C++. Если это неприемлемый вариант, вам потребуется создать DLL C++ смешанного режима (которая содержит как управляемый, так и неуправляемый код). Ваша библиотека DLL C/C++ может вызывать экспортированные функции в вашей библиотеке DLL смешанного режима, которая, в свою очередь, может переадресовывать вызовы вашему классу C#.
Ответ 2 · рейтинг 3 · Kev
Эта статья может помочь вам:
Обновлено: есть инструмент под названием mergebin, который поставляется с оболочкой .NET SQLite, которую можно использовать для создания Собственная/управляемая DLL смешанного режима. Возьмите исходный код из:
SQLite для ADO.NET 2.0 (SourceForge)
Вы найдете исполняемый файл в папке bin\tools.
Кев
Ответ 3 · рейтинг 1 · Rob Deary
На самом деле это довольно легко. Просто используйте NuGet, чтобы добавить пакет UnmanagedExports в свой проект .Net. См. https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports для получения подробной информации.
Затем вы можете экспортировать напрямую, без необходимости делать слой COM. Вот пример кода C#:
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 должен иметь возможность загружать TextExport так же, как обычная библиотека C dll.
Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.
Похожие материалы
- Как создать резиновое перетаскивание 2D-объекта в перенасыщении С++
- Не могу запустить 32-битный двоичный файл на 64-битном Debian
- Как связать и собрать проект, если ваш внешний SDK содержит только файлы .dll, .lib, .h
- Linux Pybind11 'проверка сборки -j 4' ошибка
- Пакет не найден при установке с помощью dnu install. Работает с восстановлением дну
- Как реализовать непрерывную доставку с помощью DNX и ASP.NET 5