Fragen zu best practice in C++/CLI



  • Hallo Profis,

    sicherlich sind einige von Euch diesem Problem schon mal begegnet: man hat eine C- oder C++-DLL und möchte die Funktionen aus dieser DLL in einem C#-Programm nutzen. Nun gibt es unterschiedliche Möglichkeiten, diese in C# einzubinden (z.B. DllImport usw.). Dies ist für einfache Funktionen mit einfachen Parametern ohne weiteres zu realisieren.

    Eine weitere Lösung wäre in einer Solution unter VS, in der sich das C#-Projekt bereits befindet, eine neue C++/CLI-Klassenbibliothek zu implementieren und auf diese im C#-Projekt zu verweisen. Dann können die Klassenmethoden der C++/CLI-DLL im C#-Programm einfach verwendet verwenden. Vorteil dabei: man könnte komplexe Strukturen, die im Header der C++-DLL beschrieben sind, in die C++/CLI-DLL einbinden (weil Einbindung der C-Header in C#-Projekten nicht geht), die Teilstrukturen bearbeiten und nur die benötigte Daten an C# als Parameter weiterreichen.

    Für mich stellt sich ein grundsätzliches Problem (weil ich mich noch zu den Anfängern in Sachen Programmierung zähle) in dem Handling der Übergabeparameter zwischen den einzelnen Modulen. Hier ein einfaches Beispiel für die Möglichkeiten des Handlings:

    //C++-DLL-Funktion
    extern "C"
    {
    __declspec(dllexport) void __stdcall tausche(int * a, int * b)
    {
        int temp;
        temp = *a;
        a* = b*;
        *b = temp;
    }
    }
    

    Eine Variante wäre ja in C++/CLI-DLL:

    //C++/CLI-DLL
    void CLIKlasse::clitausche(int * a, int * b)
    {
        tausche(a, b);
    }
    

    In C# wäre dann der Aufruf in einem unsicheren Code wie folgt:

    //C#
    int a=10, b=20;
    unsafe
    {
        fixed(int* aptr=&a, bptr=&b)
        {
            CLIKlasse.clitausche(aptr, bptr);
        }
    }
    

    Wie elegant ist es denn, welche Vor- und Nachteile gibt es bei dieser Variante und kann ich es mit jedem Datentyp bzw. Struktur anstellen?

    Wie wäre es denn aber, wenn ich folgendes möchte:

    C++/CLI-DLL
    void CLIKlasse::clitausche(int %a, int %b)
    {
        tausche(a, b); //wie übergebe ich hier die Referenzen???
    }
    
    C#
    int a=10, b=20;
    CLIKlasse.clitausche(ref a, ref b);
    

    Vielleicht gibt es schon eine Tabelle mit der Auflistung der Übergabe der Parameter zwischen C++, C++/CLI und C#?

    Ich hoffe (nein ich weiss!!!) ihr könnt mir weiterhelfen!!! Dafür danke ich Euch schon mal herzlich!!! 🙂 👍

    VG

    Paul

    Edit by Dravere:
    - Title gekürzt, war:
    C++/CLI Wrapper-DLL als Vermittler zwischen C#-Programm und C++-DLL (unmanaged). (C# <-> C++/CLI-DLL <-> C++



  • Ok eine weitere Möglichkeit habe ich noch gefunden:

    //C++/CLI-DLL
    void CLIKlasse::clitausche(int %a, int %b)
    {
        pin_ptr<int> x = &a, y = &b;    
        tausche(x, y);
    }
    

    damit kann ich in C# folgenden Aufruf machen

    //C#
    int a=10, b=20;
    CLIKlasse.clitausche(ref a, ref b);
    

  • Administrator

    Wir haben extra ein C++/CLI Subforum, am besten fragst du dort nach, bzw. ich verschiebe dich gleich mal. Zudem habe ich den Titel gekürzt, dass nächste Mal bitte einen etwas kürzeren nehmen 😉

    Grüssli



  • Dieser Thread wurde von Moderator/in Dravere aus dem Forum C# und .NET in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Log in to reply