Puoi chiamare una DLL C # da una DLL C?

Ho costruito una DLL in C #. Ora voglio usare l’ ambiente R 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 ++? Se sì, hai un link per informazioni su come farlo?

Il modo più semplice per farlo è esporre una delle classi C # nella DLL C # come un object COM e quindi crearne 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 class C #.

Questo articolo potrebbe aiutarti:

API di hosting CLR (MSDN)

Aggiornato: esiste uno strumento chiamato mergebin fornito con il wrapper .NETite .NET che è ansible utilizzare per creare una DLL nativa / gestita in modalità mista. Prendi il codice sorgente da:

SQLite per ADO.NET 2.0 (SourceForge)

Troverete gli exe nella cartella bin\tools .

kev

In realtà è piuttosto facile. 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 ansible esportare direttamente, senza dover fare un livello COM. Ecco il codice di esempio 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 una normale DLL C.