c++ wrapper für C# funktion



  • Hallo,
    ich hoffe ich bin hier richtig weil mein Proplem c# und C/C++ umfasst.
    ich habe in c#-dll eine c# funktion, die Datensätze aus der DB zurückliefert. diese Funktion rufe ich in C auf.
    C# funktion:

    ....
      public struct MyStructManaged
        {
            public int A;
            public string B;
            public double C;
        }
    
    public List<MyStructManaged> Test()
    ...
    

    und ich habe für diese Funktion einen Wrapper in C/C++ geschrieben

    ...
    typedef struct MyStructUnmanaged 
    {
    	 int a;
    	 char b[20];
    	 double c;
    }MyStructUnmanaged ;
    
    DLLEXPORT_IMPORT int __stdcall Wrapper_Test(MyStructUnmanaged myStructUnmanaged [], int* count)
    {
    List<MyStructManaged>^ MyStructManagedList = gcnew List<MyStructManaged>();
    ....
    GetManagedObject()->Test() // Aufruf von C# Funktion
    // die Liste iterieren und umkopieren in mein unmanaged array und den count setzen 
    }
    

    in C rufe ich meine Wrapper Funktion so

    ...
    MyStructUnmanaged StructUnmanagedArray [20]; // muss immer static und maximal länge enthalten
    int count = 0;
    Wrapper_Test(StructUnmanagedArray , &count);
    

    diese Variante funktioniert aber ich habe dazu 3 Fragen
    - geht es vielleicht noch einfacher? ich finde diese variante umständlicher. wie macht ihr das wenn ihr eine Funktion aus C# in C aufrufen wollt ohne COM?
    - ich muss das Array static und groß genug anlegen in C bevor ich die Funktion aufrufe. der Anzahl der results aus der Datenbank ist variabel und zum Zeitpunkt vor dem Aufruf unbekannt. gib es dazu eine alternative?
    - kennt ihr gute Links , Tutorials .. zu diesem Thema im Netz. Google bringt mir leider kaum etwas.
    Vielen dank!



  • youssef schrieb:

    und ich habe für diese Funktion einen Wrapper in C/C++ geschrieben

    ...
    typedef struct MyStructUnmanaged 
    {
    	 int a;
    	 char b[20];
    	 double c;
    }MyStructUnmanaged ;
    
    DLLEXPORT_IMPORT int __stdcall Wrapper_Test(MyStructUnmanaged myStructUnmanaged [], int* count)
    {
    List<MyStructManaged>^ MyStructManagedList = gcnew List<MyStructManaged>();
    ....
    GetManagedObject()->Test() // Aufruf von C# Funktion
    // die Liste iterieren und umkopieren in mein unmanaged array und den count setzen 
    }
    

    Das ist weder C noch C++, sondern "C++/CLI". Und C++/CLI ist auch dazu da, um C++ mit dem .NET Zeugs zu verheiraten. Du bist hier nur im falschen Forum.

    youssef schrieb:

    in C rufe ich meine Wrapper Funktion so

    ...
    MyStructUnmanaged StructUnmanagedArray [20]; // muss immer static und maximal länge enthalten
    int count = 0;
    Wrapper_Test(StructUnmanagedArray , &count);
    

    Warum muss das "immer static" sein?

    youssef schrieb:

    diese Variante funktioniert aber ich habe dazu 3 Fragen
    - geht es vielleicht noch einfacher? ich finde diese variante umständlicher.

    Kannst Du nicht ein "C-Array" in Wrapper_Test mit der richtigen Größe dynamisch erzeugen (malloc) und einen Zeiger darauf zurückgeben?

    youssef schrieb:

    - ich muss das Array static und groß genug anlegen in C bevor ich die Funktion aufrufe.

    Warum?

    kk


Anmelden zum Antworten