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