2009-04-08 29 views
8

Ich habe eine DLL in C# erstellt. Jetzt möchte ich die R Environment verwenden, um Funktionen in dieser DLL aufzurufen. Die R-Umgebung unterstützt das Aufrufen von nicht verwalteten C/C++ - DLLs, jedoch nicht von .NET-DLLs. Meine Frage ist also, kann ich Funktionen in einer C# DLL von einer C/C++ DLL aufrufen? Wenn ja, haben Sie einen Link zu Informationen darüber, wie dies zu tun ist?Können Sie eine C# DLL von einer C DLL aufrufen?

Antwort

9

Der einfachste Weg dies zu tun ist, eine der C# -Klassen in Ihrer C# -DLLL als COM-Objekt verfügbar zu machen und dann eine Instanz davon aus Ihrer C/C++ - DLL zu erstellen. Wenn dies keine akzeptable Option ist, müssen Sie eine C++ - DLL im gemischten Modus erstellen (die sowohl verwalteten als auch nicht verwalteten Code enthält). Ihre C/C++ - DLL kann exportierte Funktionen in Ihrer DLL im gemischten Modus aufrufen, die ihrerseits die Aufrufe an Ihre C# -Klasse weiterleiten kann.

+0

Diese C++ - DLL im gemischten Modus hört sich an, als würde sie den Trick machen - ich habe mir nur die verfügbaren Templates angesehen, um ein DLL-Projekt im gemischten Modus mit VS2008 zu erstellen, sehe aber keinen. Wie würden Sie eine DLL im gemischten Modus starten? – Guy

+0

Wenn Sie eine neue C++ - Klassenbibliothek erstellen, wird ein C++ .NET-DLL-Projekt erstellt. Solange die Einstellung "Common Language Runtime-Unterstützung" auf "Common Language Runtime-Unterstützung (/ clr)" gesetzt ist, können Sie sowohl verwalteten als auch nicht verwalteten Code im Projekt verwenden. – Andy

0

Es ist eigentlich ziemlich einfach. Verwenden Sie einfach NuGet, um das "UnmanagedExports" -Paket zu Ihrem .Net-Projekt hinzuzufügen. Einzelheiten finden Sie unter https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports.

Sie können dann direkt exportieren, ohne eine COM-Ebene zu erstellen. Hier ist der Beispiel-C# -Code:

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 sollte TextExport wie eine normale C-DLL laden können.