¿Puedes llamar a una DLL C # desde una DLL de C?

Construí una DLL en C #. Ahora quiero usar el entorno R para llamar funciones en esa DLL. El entorno R admite la invocación de DLL de C / C ++ no administradas, pero no a las DLL de .NET. Entonces mi pregunta es, ¿puedo llamar funciones en una DLL C # desde una DLL C / C ++? Si es así, ¿tiene un enlace a información sobre cómo hacer esto?

La forma más directa de hacerlo es exponiendo una de las clases C # en su DLL C # como un objeto COM, y luego crear una instancia de la misma desde su C / C ++ DLL. Si esa no es una opción aceptable, deberá crear una DLL de C ++ en modo mixto (que contenga tanto código administrado como no administrado). Su DLL C / C ++ puede llamar a las funciones exportadas en su DLL de modo mixto, que a su vez puede reenviar las llamadas a su clase C #.

Este artículo podría ayudarte:

API de CLR Hosting (MSDN)

Actualizado: Hay una herramienta llamada mergebin que se envía con el contenedor .NET SQLite que puede usar para crear una DLL nativa / administrada en modo mixto. Toma el código fuente de:

SQLite para ADO.NET 2.0 (SourceForge)

Encontrará el exe en la carpeta bin\tools .

Kev

En realidad es bastante fácil. Simplemente use NuGet para agregar el paquete “UnmanagedExports” a su proyecto .Net. Consulte https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports para obtener más información.

Luego puede exportar directamente, sin tener que hacer una capa COM. Aquí está el código de muestra 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 debería poder cargar TextExport como un dll normal de C.