Можете ли вы вызвать C # DLL из C DLL? - PullRequest
8 голосов
/ 08 апреля 2009

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

Ответы [ 3 ]

9 голосов
/ 08 апреля 2009

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

3 голосов
/ 08 апреля 2009

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

API хостинга CLR (MSDN)

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

SQLite для ADO.NET 2.0 (SourceForge)

Вы найдете файл exe в папке bin\tools.

Кев

0 голосов
/ 24 апреля 2015

Это на самом деле довольно легко. Просто используйте 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 точно так же, как обычные Cll.

...