Marshalling per Hand?
-
Hallo,
ein Struckt möchte ich von C# an eine C++ Dll übergeben. Dazu muss in C# vermutlich das Marshalling per Hand gemacht werden. Könnte mir jemand dabei helfen?
Ein Beispiel dazu, in C++ bzw. in der DLL sieht das so aus:
struct myStructArrays { float myArray[5]; float* my2DArray; int my2DArrayXSize; int my2DArrayYSize; }; float calculateArray(struct myStructArrays myArrays[], int size) { // In Array schreiben myArrays[0].myArray[0] = 12; myArrays[0].my2DArray[0] = 23; // Wert zurückgeben return myArrays[0].myArray[1]; }
In C# nutze ich folgende Importbeschreibung:
private struct myStructArrays { public float[] myArray; public float[,] my2DArray; } [DllImport("myDLL.dll")] private static extern float calculateArray([In, Out] myStructArrays[] myArrays, int size);
und zum Testen habe ich folgendes versucht:
float[] myArray = new float[3]; myArray[0]=1; myArray[1]=2; myArray[2]=3; const int x = 3, y = 3; float[,] my2DArray = new float[x, y]; for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { my2DArray[i, j] = i * j; } } myStructArrays[] myArrays = new myStructArrays[2]; myArrays[0].myArray = myArray; myArrays[0].my2DArray = my2DArray; myArrays[0].my2DArrayXSize = x; myArrays[0].my2DArrayYSize = y; System.Console.Out.WriteLine(myArrays[0].my2DArray[1,2]); float ret = calculateArray(myArrays, 2); System.Console.Out.WriteLine(ret); System.Console.Out.WriteLine(myArrays[0].my2DArray[1,2]);
um das Marshalling in C# per Hand zu machen kann wohl die Klasse Marshal genutzt werden. Irgendwie funktioniert es wohl mit dem IntPtr als Typ wie ich schon in Beispielen gesehen habe.
IntPtr my2DArray = Marshal.???
Wie das aber jetzt in meinem Fall genau funktioniert ist mir nicht klar. Könnte mir bitte jemand helfen?