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
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#.
Ten artykuł może ci pomóc:
Aktualizacja: Istnieje narzędzie o nazwie mergebin że statki z .NET SQLite wrapper można użyć do tworzenia mieszany tryb natywny/zarządzanego DLL. Pobierz kod źródłowy z:
SQLite for ADO.NET 2.0 (SourceForge)
Musisz znaleźć exe w folderze bin\tools
.
Kev
Dzięki za link Kev - ciekawa lektura. – Guy
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.
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
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