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( ????? ); // Funktion keine Methode. Was muss ich zwischen Klammern schreiben???
        private void btnExecute_Click(object sender, EventArgs e)
        {
              initialize( ???? );
        }
    }


Moderiert von user profile iconChristian S.: Topic aus WinForms verschoben am Sa 25.06.2016 um 19:11
Moderiert von user profile iconTh69: 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

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
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)


doubleII - Mo 27.06.16 17:10

ich habe hier weiter geschrieben:
http://www.mycsharp.de/wbb2/thread.php?postid=3790291#post3790291
Zitat:
Und bitte Crossposts immer angeben: myCSharp.de - Unmanaged Dll C++ die Funktionen in C Sharp einbinden

Sorry Th69, mache ich :).

Wäre mich frohen, wenn jemand etwas Vorschlagen kann.


Christian S. - Mo 27.06.16 17:15

Hast Du hier mal geschaut?
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
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


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.