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!