Entwickler-Ecke
Basistechnologien - Unmanaged Dll C++ Funktionen in C# einbinden
doubleII - Sa 25.06.16 19:02
Titel: Unmanaged Dll C++ Funktionen in C# einbinden
Hallo zusammen, Ich habe folgendes Problem:
Ich habe eine C# Application und ein C++ Projekt. MS Visual .net 2015.
Wie rufe ich jetzt von C# eine C++ Funktionen auf.
Suche schon einige Zeit und hab leider noch kein passendes Bsp gefunden.
Wo könnte man mehr Info findet?
Ich habe eine Toolbox und der Code für sie ist auf C++ geschrieben, wie man oben als Beispiel eine Funktion sehen kann. Dll Datei habe ich zur Verfügung.
Ich wäre sehr dankbar , wenn mir jemand ein bisschen mehr erklären kann.
Vielen Dank!
Hier ist eine Funktion von dem C++ Code:
C ++ Funktion
Quelltext
1: 2: 3: 4: 5:
| int Toolbox::Initialize(LPCSTR systemPath, LPCSTR license, DLL_LogFunc* logFunc) { if (m_initialize) return m_initialize((char*)systemPath,(char*)license,logFunc); return -1; } |
C Sharp
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| using System.Runtime.InteropServices;
namespace Project_1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
[DllImport("Toolbox.dll")] public static extern int Initialize( ????? ); private void btnExecute_Click(object sender, EventArgs e) { initialize( ???? ); } } |
Moderiert von Christian S.: Topic aus WinForms verschoben am Sa 25.06.2016 um 19:11
Moderiert von Th69: Titel geändert ("C#" statt "C Scharp")
Delete - Sa 25.06.16 19:26
- Nachträglich durch die Entwickler-Ecke gelöscht -
Christian S. - Sa 25.06.16 19:48
Frühlingsrolle hat folgendes geschrieben : |
dazu müsstest du im C# Projekt einen Verweis hinzufügen (zu finden im Projektmappen Explorer). Anschließend muss nur noch nach der Dll gesucht werden.
Den Verweis-Namen trägst du noch als using VerweisName im Projekt ein, und schon solltest du die Klasse mit ihren Funktionen aufrufen können. |
Das geht nur bei .NET-Assemblies. Da er DLLImport benutzt, dürfte er die Funktionen einer Win32-DLL nutzen wollen und sucht nun nach den korrekten Parametern für die .NET-seitige Methode.
Hier gibt es einen Aritkel dazu, der auch eine Liste mit Win32 <> .NET Entsprechungen enthält:
http://www.codeproject.com/Articles/9714/Win-API-C-to-NET
Delete - Sa 25.06.16 22:18
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69 - So 26.06.16 09:26
Hallo doubleII und :welcome:
DLLImport funktioniert, so wie Christian schon verlinkt hat, am einfachsten für eine C-Schnittstelle.
Bei C++ besteht zum einen die Schwierigkeit bzgl. des
Name mangling [
https://en.wikipedia.org/wiki/Name_mangling], aber die Hauptproblematik besteht in der unterschiedlichen Speicherverwaltung bei C# und C++ (d.h. wenn du C++ Klassen wie z.B.
DLL_LogFunc einbinden willst, dann mußt du das Speicherlayout exakt 1:1 in C# nachbauen - dies nennt man Marshalling).
Ich würde dir daher davon abraten, direkt eine C++ DLL in C# einzubinden (zu versuchen).
Erstelle dir eine Wrapper-DLL mit einer reinen C-Schnittstelle, d.h. nur globale Funktionen und native Datentypen!
Edit:
Und bitte Crossposts immer angeben:
myCSharp.de - Unmanaged Dll C++ die Funktionen in C Sharp einbinden [
http://www.mycsharp.de/wbb2/thread.php?threadid=117404]
PS:
@Frühlingsrolle: Trotzdem kommt es auch bei VS auf den Projekttyp an (es gibt natives C++ und C++/CLI - und nur letzteres erzeugt .NET Assemblies)
Christian S. - Mo 27.06.16 17:15
Hast Du hier mal geschaut?
Th69 - Di 28.06.16 10:20
Hallo doubleII,
wie du siehst sind Crossposts für uns Helfer nur schwer nachzuverfolgen, aber ich habe dir in dem anderen Beitrag geantwortet.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!