Ich arbeite an der Aktualisierung der GUI einer nativen (MFC) -Anwendung mit .NET und WPF. Die Anwendung sammelt Daten in Echtzeit und die GUI soll diese Daten (in Echtzeit) visualisieren. Der Gesamtplan besteht darin, C++/CLI als Interoperabilitätsschicht zwischen der nativen Anwendung und dem verwalteten GUI-Teil zu verwenden.Wie verwende ich dieses native Array in meiner .NET-Klasse?
Ich habe eine native Klasse mit Byte-Arrays, die einen "Header" enthalten, der die Länge des Arrays und den Typ der Elemente angibt. Ich versuche, eine Interoperabilitätsebene in C++/CLI zwischen dieser nativen Klasse und einer verwalteten .NET-Klasse zu schreiben.
Ich möchte das nicht verwaltete Byte-Array im verwalteten Teil der Anwendung verwenden. Ich bin etwas überwältigt von Informationen über verschiedene Blogs und Dokumentationszentren. Dies ist der Umriss von dem, was ich bisher habe, es funktioniert irgendwie, aber stürzt manchmal ab *. Ich bin mir nicht sicher, ob dies die geeignetste Lösung ist oder wie man sie richtig implementiert. Ich würde gerne wissen, ob es einen geeigneteren Ansatz gibt?
// Fetch numbers from the native class into unmanaged memory.
IntPtr ipNumbers = InteropServices::Marshal::AllocHGlobal(sizeof(int) * arrayLength))
nativeClass->fetchNumbers((int *) ipNumbers.ToPointer(), arrayLength);
// Copy data from unmanaged memory into a managed array.
cli::array<int, 1> ^numbers = gcnew cli::array<int, 1>(arrayLength);
InteropServices::Marshal::Copy(ipNumbers, numbers, 0, arrayLength);
InteropServices::Marshal::FreeHGlobal(ipNumbers);
*) Crash-Meldung:. „Windows einen Haltepunkt in MyProgram.exe ausgelöst hat zu einer Verfälschung des Haufens auf Grund dieser sein kann, was er geladen hat einen Fehler in MyProgram.exe oder eine der DLLs anzeigt [...] ". Von dem, was ich sagen kann, ist es FreeHGlobal
, die den Absturz verursacht.
Ihr Code sieht gut aus, ich weiß nicht, warum es einen Absturz verursachen würde, ohne mehr Code zu sehen. Sie können die Zuweisung des nicht verwalteten Arbeitsspeichers vermeiden, indem Sie ein pin_ptr für das Nummern-Array verwenden und dieses direkt an fetchNumbers übergeben. –
Ich habe den Code geändert, um stattdessen ein pin_ptr von Zahlen zu verwenden, und das scheint zu funktionieren. (Ich werde meinen Beitrag mit dem Code aktualisieren.) :-D Ich denke, das einzige, was ich dann wissen muss, ist, ob dies der beste Ansatz ist. –