Frage zu Kommunikation zwischen C# Anwendung und C++ CLI DLL
-
Hallo Gemeinde,
bin im Moment dabei meine ersten Versuche mit CLI-DLL's zu machen.
Habe mir etwas ganz einfaches zusammen gestellt, bekomme es aber nicht wie gewünscht zu laufen..h
#pragma once #ifndef my_func_h #define my_func_h #include <string> using namespace System; using namespace std; namespace myFunc { public ref class my_func { public: my_func(); // TODO: Fügen Sie hier Ihre Methoden für diese Klasse ein. string retSampleText(); }; } #endif // !my_func_h
.cpp
#include "pch.h" #include "my_func.h" namespace myFunc { my_func::my_func() { //do something later //getRetMessage(); }; string my_func::retSampleText() { return "Hallo Du aus der CLI DLL :-)"; } }
in C# dann:
.csusing ccfunc; namespace my_func { public partial class sccMainForm : Form { my_func wfc; public sccMainForm() { InitializeComponent(); wfc = new my_func(); } private void lblTmpCheck_Click( object sender, EventArgs e ) { lblTmpCheck.Text = wfc.ToString(); } } }
wfc wird erstellt?! ist jedenfalls nicht 'null'!
Nur wie bekomme ich jetzt Zugriff auf die public-Funktion retSampleText()?Erstellen bei beiden Projekten ohne Fehler, Ausführen auch. Nur die Kommunikation?!
Danke schon mal an alle die helfen( -wollen )
Schönen Tag noch
-
Du rufst doch auch nicht
retSampleText()
auf (sondernToString()
)?
Außerdem ist (std::
)string
ein Datentyp aus C++, der nicht mit .NET kompatibel ist. Verwende den .NET-DatentypString^
(^
gibt an, daß es sich um einen .NET-Referenzdatentyp handelt).
Mithilfe von How to: Convert Standard String to System::String:String^ my_func::retSampleText() { string str("Hallo Du aus der CLI DLL :-)"; return gcnew String(str.c_str()); }
Für ein direktes C-String-Literal braucht man jedoch nicht den Umweg über
std::string
gehen, sondern kann direktreturn gcnew String("...")
verwenden. Wenn du jedoch mit einem bestehenden C++ Code interagieren möchtest, dann wirst du eben diese Umwandlungen benötigen (s. auch die anderen "How to " links im obigen MSDN-Link).Außerdem fällt mir auf, daß der
namespace
dochmyFunc
heißt, du aber in C#ccfunc
verwendest?!
Damit du nicht zwischen Namensbereichen und Klassen durcheinander kommst, solltest du Namensbereiche im Plural benennen, z.B.MyFunctions
.
-
@Th69 Danke für die schnelle Antwort,
@Th69 sagte in Frage zu Kommunikation zwischen C# Anwendung und C++ CLI DLL:
Du rufst doch auch nicht retSampleText() auf (sondern ToString())?
und genau darum gehts mir. An retSampleText() komme ich nicht ran, es werden nur Equals, ToString(), ... angeboten?!
Sowohl in C++ als auch in C# komme ich doch über my_func wfc = new my_func(); an die public Member ran.
Einfach ausgedrückt suche ich eine Verbindung zwischen der C# Anwendung und der DLL zwecks Austausch von Objekten, hier als Beispiel stringAußerdem fällt mir auf, daß der namespace doch myFunc heißt, du aber in C# ccfunc verwendest?!
Sorry, bei "Aufhübschen zwecks Lesbarkeit" passiert. In den Sourcen stimmt es
-
@Smitty
Verzeihe mir die Frage, aber warum möchtest du C++ CLI DLL verwenden? Würde da nicht auch eine C# DLL funktionieren?
-
@Smitty sagte in Frage zu Kommunikation zwischen C# Anwendung und C++ CLI DLL:
Einfach ausgedrückt suche ich eine Verbindung zwischen der C# Anwendung und der DLL zwecks Austausch von Objekten, hier als Beispiel string
Ich habe dir doch geschrieben, daß der C++ Datentyp
string
nicht von .NET (C#) aus funktioniert. Hast du mal meinen Code benutzt?
-
@Quiche-Lorraine sagte in Frage zu Kommunikation zwischen C# Anwendung und C++ CLI DLL:
Verzeihe mir die Frage, aber warum möchtest du C++ CLI DLL verwenden? Würde da nicht auch eine C# DLL funktionieren?
Natürlich reicht auch eine C# DLL aus, aber es geht mir um den grundlegenden Einstieg. Also nur aus Interesse.
Und zu Testzwecken.
Habe eine in C# geschriebene Anwendung, mit der ich ganze Verzeichnisbäume nach versch. Dateien oder Dateitypen durchgehe, auch auf meinem NAS, und ich wollte einfach mal den Geschwindigkeitsunterschied - wenn es denn einen gibt - sehen.@Th69 sagte in Frage zu Kommunikation zwischen C# Anwendung und C++ CLI DLL:
Ich habe dir doch geschrieben, daß der C++ Datentyp string nicht von .NET (C#) aus funktioniert.
Es geht mir auch nicht um den
string
, könnte auch jeder andere Datentyp etc. sein, es geht mir um die Kommunikation zwischen der C# Anwendung und der C++ CLI DLL. Also um den Zugriff aus C# auf C++ Klassen / deren Funktionen in der DLL und Auswerten der Rückgaben in C#
Genauer gesagt: wie rufe ich aus C# die FunktionretSampleText()
aus der Klassemy_func
auf um den Text zu bekommen und irgendwie / irgendwo in der C# Anwendung auszugeben?
Schritt für Schritt. Erst den Zugriff, dann die Rückgabe bekommen, dann aus dem was auch immer da zurück gegeben wird etwas sinnvolles machen - fertig@Th69 sagte in Frage zu Kommunikation zwischen C# Anwendung und C++ CLI DLL:
Hast du mal meinen Code benutzt?
Ja, auch in der DLL so verwendet. Wenn ich im C# Projekt bei Verweise auf
Im Objektkatalog anzeigen
gehe, und dort aufmy_func
klicke, wirdretSampleText()
als Member vonmyFunc.my_func
angezeigt.
Also wie komme ich jetzt an die Funktion ran?Oder bin ich mit dem Weg:
- erst Klasse erstellen,
- dann - wo gebraucht - Objekt oder Referenz erstellen,
- dann zugreifen
schon auf dem ganz falschen Dampfer?
-
@Smitty sagte in Frage zu Kommunikation zwischen C# Anwendung und C++ CLI DLL:
lblTmpCheck.Text = wfc.ToString();
Hast du diesen Code mal durch
lblTmpCheck.Text = wfc.retSampleText();
ersetzt?
Erst den Zugriff, dann die Rückgabe bekommen, ...
Dies ist aber wichtig, da eben nur .NET-Datentypen von C# aus verarbeitet werden können (daher wird es nur mit meinem Code kompilieren).
-
@Th69 sagte in Frage zu Kommunikation zwischen C# Anwendung und C++ CLI DLL:
Hast du diesen Code mal durch
lblTmpCheck.Text = wfc.retSampleText();war wohl in der DLL etwas nicht ok, obwohl sie erstellt wurde???. Also bereinigt, neu erstellt - und schon funktionierts
und genau daran lags, denn da kam dann:
CS0570 "my_func.retSampleText(basic_string<char,std::char_traits<char>,std::allocator<char> >*)" wird von der Sprache nicht unterstützt.
Danke für Deine Geduld Th69