2009-04-08 28 views
8

Ho creato una DLL in C#. Ora voglio usare il R Environment per chiamare le funzioni in quella DLL. L'ambiente R supporta chiamate alle DLL non gestite di C/C++ ma non a quelle di .NET. Quindi la mia domanda è, posso chiamare le funzioni in una DLL C# da una DLL C/C++? In tal caso, hai un link per informazioni su come farlo?È possibile chiamare una DLL C# da una DLL C?

risposta

9

Il modo più semplice per farlo è esporre una delle classi C# nella DLL C# come un oggetto COM e quindi creare un'istanza dalla DLL C/C++. Se questa non è un'opzione accettabile, è necessario creare una DLL C++ in modalità mista (che contenga sia codice gestito che non gestito). La DLL C/C++ può chiamare funzioni esportate nella DLL in modalità mista, che a sua volta può inoltrare le chiamate alla classe C#.

+0

Questa DLL in modalità mista C++ sembra fare il trucco: ho appena dato un'occhiata ai modelli disponibili per creare un progetto DLL in modalità mista utilizzando VS2008 ma non ne vedo uno. Come andresti sull'avvio di una DLL in modalità mista? – Guy

+0

Se si crea una nuova libreria di classi C++, viene creato un progetto DLL C++ .NET. Finché l'impostazione "Common Language Runtime support" è impostata su "Common Language Runtime support (/ clr)", sei libero di utilizzare sia il codice gestito che non gestito nel progetto. – Andy

0

In realtà è piuttosto semplice. Basta usare NuGet per aggiungere il pacchetto "UnmanagedExports" al tuo progetto .Net. Vedi https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports per i dettagli.

È quindi possibile esportare direttamente, senza dover fare un livello COM. Ecco l'esempio di codice 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 dovrebbe essere in grado di caricare TextExport proprio come un normale C dll.