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
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.
Dieser Artikel könnte Sie helfen:
Aktualisiert: ist es ein Werkzeug mergebin, das mit dem .NET SQLite wrapper genannt können Sie verwenden, um einen gemischten Modus nativ/verwaltete DLL zu erstellen. Schnappen Sie den Quellcode aus:
SQLite for ADO.NET 2.0 (SourceForge)
Sie finden die exe im bin\tools
Ordner.
Kev
Danke für den Link Kev - interessante Lektüre. – Guy
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.
- 1. C# dll aus Java aufrufen
- 2. Kann eine DLL eine .NET DLL aufrufen?
- 3. C++ eine DLL einhängen?
- 4. Dynamisch P/Aufrufen einer DLL
- 5. C Dll-Import C#
- 6. C# -Rückruf von DLL
- 7. Wie C++ DLL in C#
- 8. Aufruf C# DLL in C++
- 9. C Laufzeitobjekte, DLL-Grenzen
- 10. Aufrufen einer Delphi-DLL-Methode aus C# -Code
- 11. Programmgesteuert erzeugen Sie eine C Win32 DLL
- 12. Seltsames Problem Aufruf einer .DLL von C#
- 13. Aktivieren Sie C-DLL in VB.net-Code aufrufen
- 14. Importieren einer c-DLL-Funktion in C#
- 15. Calling C# DLL in Vbscript
- 16. von einer C# -Methode, wie eine DLL aufrufen und ausführen, wobei der DLL-Name aus einer String-Variablen stammt?
- 17. C + + DLL-Schleife Problem
- 18. Debug C++ DLL in C#
- 19. Erstellen einer DLL-Datei in C# .Net
- 20. Verwaltete C++ - DLL aus C#
- 21. C# Absturz beim Laden von C++ DLL
- 22. C++ DLL in C-Programm
- 23. Aufruf einer c DLL aus C++, C# und Ruby
- 24. C# dll Importfunktion korrekt
- 25. C++: Dll Entladen Problem
- 26. Wrap native DLL für C#
- 27. Ist es möglich, dass eine C# -Dll ein Ereignis auslöst, das eine andere C# -Dll behandelt?
- 28. Debug CUDA Dll von C#
- 29. Exportieren von Funktionen von C++ - DLL zu C# P/Invoke
- 30. aufrufen CUDA kompilierte .dll von R - .C vs. Call
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
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