Можно ли вызвать C# DLL из C DLL?

Я создал DLL на С#. Теперь я хочу использовать R Environment для вызова функций в этой DLL. Среда R поддерживает вызов неуправляемых библиотек DLL C/C++, но не .NET DLL. Итак, мой вопрос: могу ли я вызывать функции в C# DLL из C/C++ DLL? Если да, то есть ли у вас ссылка на информацию о том, как это сделать?


person Guy    schedule 08.04.2009    source источник
comment
Возможный дубликат Вызов C# из C   -  person StayOnTarget    schedule 17.04.2018


Ответы (3)


Самый простой способ сделать это — представить один из классов C# в DLL C# как COM-объект, а затем создать его экземпляр из DLL C/C++. Если это неприемлемый вариант, вам потребуется создать DLL C++ смешанного режима (которая содержит как управляемый, так и неуправляемый код). Ваша библиотека DLL C/C++ может вызывать экспортированные функции в вашей библиотеке DLL смешанного режима, которая, в свою очередь, может переадресовывать вызовы вашему классу C#.

person Andy    schedule 08.04.2009
comment
Похоже, что DLL C++ в смешанном режиме справится с задачей - я только что просмотрел шаблоны, доступные для создания проекта DLL в смешанном режиме с использованием VS2008, но не вижу ни одного. Как бы вы начали запускать DLL смешанного режима? - person Guy; 08.04.2009
comment
Если вы создаете новую библиотеку классов C++, это создает проект C++ .NET DLL. Пока для параметра поддержки Общеязыковой среды выполнения установлено значение Поддержка Общеязыковой среды выполнения (/clr), вы можете свободно использовать в проекте как управляемый, так и неуправляемый код. - person Andy; 08.04.2009

Эта статья может помочь вам:

CLR Hosting API (MSDN)

Обновлено: есть инструмент под названием mergebin, который поставляется с оболочкой .NET SQLite, которую можно использовать для создания Собственная/управляемая DLL смешанного режима. Возьмите исходный код из:

SQLite для ADO.NET 2.0 (SourceForge)

Вы найдете исполняемый файл в папке bin\tools.

Кев

person Kev    schedule 08.04.2009

На самом деле это довольно легко. Просто используйте 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.

person Rob Deary    schedule 24.04.2015