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.