Pointer -> dll (C++) -> C#



  • Hallo,

    ich hab eine Methode mit einem float-Pointer als Rückgabewert in C++ definiert/declariert und eine DLL erstellt:

    extern "C" __declspec(dllexport) float *GetHeights(const char *pszFilename,int &numElevations);
    

    Jetzt weiß ich nicht, wie ich dies in C# einbinden kann!

    Kann mir jemand helfen???



  • Einfach mal unter den Begriff "DllImport" googeln.



  • Hi,

    So geht es, das weiß ich.

    [DllImport(DLLFileName, EntryPoint="...")] public static extern ... ;
    

    Nur ... was ist ein Pointer. IntPtr???



  • Dies ist ein ziemlich ausführliches Thema.
    Grundsätzlich ist es am besten und am einfachsten einen Dll-Wrapper in managed C++ zu schreiben.
    Wenn man unter C# doch importiert möchte, dann musst du noch unterscheiden ob du den unsafe-Bereich nutzen möchtest oder es ohne machen möchtest.
    Im unsafe kannst du den * benutzen, ansonsten musst du auf den IntPtr zurückgreifen wenn du den Übergabe bzw. Rückgabewert nicht genau kennst.

    Ansonsten z.B.
    const char *pszFilename --> string plzFilename bzw. StringBuilder plzFilename.



  • Hallo,

    mit IntPtr für float* müsste es so funktionieren:

    //  Aus DLL: float *GetHeights(const char *pszFilename,int &numElevations); 
    [DllImport(DLLFileName, EntryPoint="GetHeights"
    public static extern IntPtr GetHeights(string pszFilename, out int numElevations);
    

    Aber wie kann ich diesen IntPtr (ist ja ein Integer, oder???) in einen float-Array umwandeln???



  • Nein, der Pointer ist nur vom typ Integer

    Probier mal das:

    int numElevations
    IntPtr pArray = GetHeights( "", out numElevations);
    float[] array = new float[numElevations];
    Marshal.Copy(pArray, array, 0, numElevations);



  • Hallo,

    super! Vielen Dank, jetzt funktioniert's!



  • Hallo,

    noch eine kleine Anfrage:

    Wie kann ich den IntPtr vom Heap entfernen/löschen???

    IntPtr pArray = GetHeights( "", out numElevations); // pArray mag ich vom Heap entfernen
    Marshal.Copy(pArray, array, 0, numElevations); // Tiefe Kopie???
    


  • mit Marshal::FreeHGlobal(pArray) wird der Pionter wieder freigegeben!


Anmelden zum Antworten