C++ 2d int Array aus dll nach C# 2d int Array einlesen ?



  • Hallo,

    ich habe ein my.dll (Borland C++), wo er ein 2D int Array Daten liefert:

    extern "C" MP5 Berechne(int iM, int iJ);
    
     struct MP5
     {
     int iTMJ[5][12];
     };
    
     MP5 iTMJ;
    
     MP5 _export Berechne(int iM, int iJ)
     {
     ArrayFüllung...
     return(iTMJ);
     }
    
    public struct MP5 { public static int[,] iFelder = new int[5, 12];}
    
     MP5 iTMJ;
    
     [DllImport("my.dll", EntryPoint = "Berechne", CallingConvention = System.Runtime.InteropServices.CallingConvention.C decl, CharSet = CharSet.Auto, SetLastError = true)]
     public static extern MP5 Berechne(int iM, int iJ);
    
     iTMJ = Berechne(1, 2014);
    

    Am Ende rufe ich die im DLL enthaltene Funktion auf und übergebe auch Daten, er stürzt ab und die 2D Daten werden nicht dem iTMJ zugewiesen warum ?

    Könnte jemand bitte helfen.

    MFG



  • Was du versuchsts ist nicht mehr triviales Marshaling. Als erstes würde ich nochmals überlegen, ob das wirklich so sein muss vom Design her. Arrays als Rückgabewerte sind sowieso immer etwas speziell. Wenn du zum Schluss kommst, dass es dennoch notwendig ist, solltest du diese MSDN Seite studieren und dich mit MarshalAs beschäftigen. Vermutlich kann man das auch auf Rückgabewerte anwenden.



  • Hallo,

    1.denn bis jetzt habe ich kein Problem gehabt in C++, bis ich jetzt in C# auf sowas stoße.

    2.Wie kann ich vom Design her sonst dies cleverer lösen in C++ My.dll? ("ob das wirklich so sein muss vom Design her. Arrays als Rückgabewerte sind sowieso immer etwas speziell").

    Ich muß ein C++: int[5][12] Array aus dem My.dll.Berechne() nach C# int[,] iTMJ = new int[5, 12]; oder int[][] iTMJ = new int[5][]; Array zurückliefern. Anscheinend passen die ArrayStrukturen nicht überein denn das Array aus dem My.dll hat ein Struktur: iTMJ = ((0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), ...);

    3.Für einen Sourcecode wäre ich dankbar, denn ich komme leider gar nicht so weiter

    MFG



  • Du könntest eine C++/CLI Wrapper DLL bauen. u.U. ist das besser als die PInvoke-Variante.

    http://msdn.microsoft.com/en-us/magazine/dd315414.aspx


Anmelden zum Antworten