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:
    .cs

    using 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 (sondern ToString())?
    Außerdem ist (std::)string ein Datentyp aus C++, der nicht mit .NET kompatibel ist. Verwende den .NET-Datentyp String^ (^ 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 direkt return 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 doch myFunc 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 string

    Auß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 Funktion retSampleText() aus der Klasse my_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 auf my_func klicke, wird retSampleText() als Member von myFunc.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 👍


Log in to reply