Ich habe eine C++ DLL, die ein int*
an ein C# -Programm zurückgibt. Das Problem ist die int*
in C# bleibt null
nach der Zuweisung.Convert IntPtr zu int * in C#?
Wenn ich das C++ Ergebnis einer IntPtr
zuweisen, erhalte ich einen richtigen Wert ungleich Null. Jeder Versuch, dies zu einem int*
zu konvertieren, führt jedoch zu null
.
Ich habe versucht:
IntPtr intp = cppFunction(); // Non-null.
int* pi = (int *) intp; // Results in null.
int* pi = (int *) intp.ToPointer(); // Results in null.
void* vp = intp.ToPointer();
int* pi = (int *) vp; // Results in null, but vp is non-null.
Wie kann ich einen Nicht-Null-int*
bekommen?
Danke!
void cppFunction(ref int* ptr) {
ptr = somevalue;
}
, dass Ihr Problem lösen sollte: Alan
verwendete ich den Standard malloc() Funktion von msvcrt.dll als "cppFunction()". Es funktionierte für mich in Ordnung, ich konnte sogar den zugewiesenen Speicherplatz lesen/schreiben. Wenn ich Intp (IntPtr intp = (IntPtr) 1000;) eine Zufallszahl zugewiesen habe, bekam ich eine NullPointerException nur beim Dereferenzieren. Dennoch war der Wert des Zeigers nie null ... Können Sie mir ein kleines, komplettes Programm geben, das die falschen Ergebnisse produziert? – Hali
haben Sie die Möglichkeit, das C++ zu refaktorieren, so dass Sie IntPtr mit dem erforderlichen Speicher übergeben können? es wäre besser so - oder schließen Sie einen Rückruf, um den Speicher in C# gemäß http://stackoverflow.com/questions/9378626/how-can-i-return-a-stringbuilder-or-other-string- buffer-from-a-pinvoke-native-ca – dice