2009-04-08 16 views
8

Zbudowałem DLL w języku C#. Teraz chcę użyć R Environment do wywoływania funkcji w tej bibliotece DLL. Środowisko R obsługuje wywoływanie niezarządzanych bibliotek C/C++, ale nie w bibliotekach .NET DLL. Moje pytanie brzmi: czy mogę wywoływać funkcje w bibliotece DLL z biblioteki C# C++? Jeśli tak, czy masz link do informacji o tym, jak to zrobić?Czy możesz wywołać bibliotekę DLL z biblioteki C#?

Odpowiedz

9

Najbardziej prostym sposobem na zrobienie tego jest odsłonięcie jednej z klas C# w bibliotece DLL C# jako obiektu COM, a następnie utworzenie jej instancji z biblioteki DLL C/C++. Jeśli nie jest to dopuszczalna opcja, musisz utworzyć bibliotekę DLL w trybie mieszanym w trybie C++ (zawierającą zarówno kod zarządzany, jak i niezarządzany). Twoja biblioteka DLL w C/C++ może wywoływać wyeksportowane funkcje w bibliotece DLL w trybie mieszanym, która z kolei może przekazywać dalej wywołania do klasy C#.

+0

Ten tryb mieszany C++ DLL brzmi tak, jakby to wystarczyło. Właśnie zapoznałem się z dostępnymi szablonami, aby utworzyć projekt DLL w trybie mieszanym za pomocą VS2008, ale go nie widzę. Jak byś zaczął używać biblioteki DLL w trybie mieszanym? – Guy

+0

Jeśli utworzysz nową bibliotekę klas C++, która utworzy projekt C++ .NET DLL. Tak długo, jak ustawienie "Obsługa języka Common Language Runtime" jest ustawione na "Obsługa języka Common Language Runtime (/ clr)", możesz używać zarówno zarządzanego, jak i niezarządzanego kodu w projekcie. – Andy

0

To jest całkiem łatwe. Po prostu użyj NuGet, aby dodać pakiet "UnmanagedExports" do swojego projektu .Net. Aby uzyskać szczegółowe informacje, patrz https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports.

Można następnie eksportować bezpośrednio, bez konieczności wykonywania warstwy COM. Oto przykładowy kod 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 powinien być w stanie załadować TextExport tak jak zwykły dll C.

Powiązane problemy