2009-04-08 64 views
8

He creado una DLL en C#. Ahora quiero usar el R Environment 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?¿Puedes llamar a una DLL de C desde una DLL de C?

Respuesta

9

La forma más sencilla de hacer esto es exponer una de las clases C# en su C# DLL 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#.

+0

Ese modo mixto de C++ DLL suena como si fuera el truco. Acabo de echar un vistazo a las plantillas disponibles para crear un proyecto de DLL de modo mixto usando VS2008 pero no veo una. ¿Cómo vas a comenzar con una DLL de modo mixto? – Guy

+0

Si crea una nueva biblioteca de clases de C++, crea un proyecto DLL de C++. Siempre que la configuración "Common Language Runtime support" esté configurada en "Common Language Runtime support (/ clr)", puede usar tanto código administrado como no administrado en el proyecto. – Andy

0

En realidad es bastante fácil. Simplemente use NuGet para agregar el paquete "UnmanagedExports" a su proyecto .Net. Vea https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports para más detalles.

Puede exportar directamente, sin tener que hacer una capa COM. Aquí está la muestra de código 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 debe ser capaz de cargar TextExport al igual que un archivo DLL estándar C.

Cuestiones relacionadas