Я создал DLL на С#. Теперь я хочу использовать R Environment для вызова функций в этой DLL. Среда R поддерживает вызов неуправляемых библиотек DLL C/C++, но не .NET DLL. Итак, мой вопрос: могу ли я вызывать функции в C# DLL из C/C++ DLL? Если да, то есть ли у вас ссылка на информацию о том, как это сделать?
Можно ли вызвать C# DLL из C DLL?
Ответы (3)
Самый простой способ сделать это — представить один из классов C# в DLL C# как COM-объект, а затем создать его экземпляр из DLL C/C++. Если это неприемлемый вариант, вам потребуется создать DLL C++ смешанного режима (которая содержит как управляемый, так и неуправляемый код). Ваша библиотека DLL C/C++ может вызывать экспортированные функции в вашей библиотеке DLL смешанного режима, которая, в свою очередь, может переадресовывать вызовы вашему классу C#.
Эта статья может помочь вам:
Обновлено: есть инструмент под названием mergebin, который поставляется с оболочкой .NET SQLite, которую можно использовать для создания Собственная/управляемая DLL смешанного режима. Возьмите исходный код из:
SQLite для ADO.NET 2.0 (SourceForge)
Вы найдете исполняемый файл в папке bin\tools
.
Кев
На самом деле это довольно легко. Просто используйте 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.