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?


Anmelden zum Antworten