Ich untersuche derzeit die Verwendung von C++/CLI, um die Lücke zwischen verwaltetem C# und nativem, nicht verwaltetem C++-Code zu schließen. Ein besonderes Problem, das ich zu lösen suche, ist die Konvertierung von Datentypen, die in C# und C++ unterschiedlich sind.
Während ich mich über die Verwendung eines solchen Überbrückungskonzepts und die damit verbundenen Leistungsauswirkungen informierte, fragte ich mich, wie die Garbage Collection funktionieren würde. Insbesondere, wie der Garbage Collector die Bereinigung von Objekten handhaben würde, die auf einer der beiden Seiten erstellt wurden, wenn sie auf der "anderen Seite" referenziert/zerstört werden.
Bislang habe ich verschiedene Artikel und Fragen in Foren gelesen über StackOverflow y MSDN Das hat mich zu der Annahme geführt, dass der Garbage Collector in beiden Codetypen arbeiten sollte, wenn er im selben Prozess ausgeführt wird - d. h. wenn ein Objekt in C# erstellt und an die C++/CLI-Brücke übergeben wurde, würde es erst dann gesammelt werden, wenn die Referenzen auf beiden Seiten nicht mehr verwendet werden.
Meine Frage besteht in diesem Fall aus drei Teilen:
- Gehe ich recht in der Annahme, dass der Garbage Collector über beide Teile des Codes (C# und C++/CLI) funktioniert, wenn er im selben Prozess ausgeführt wird?
- In Bezug auf 1: Wie funktioniert es unter diesen Umständen (insbesondere im Hinblick auf die Bereinigung von Objekten, auf die beide Codebasen verweisen).
- Gibt es Vorschläge, wie man die Aktivität des Garbage Collectors überwachen kann - z.B. durch das Schreiben von Tests, die prüfen, wann Garbage Collection stattfindet; oder durch ein Programm, das den Garbage Collector selbst überwacht.
Ich habe bereits etwas von einem Verständnis, wie der Garbage Collector im Allgemeinen funktioniert, so dass meine Fragen hier spezifisch für das folgende Szenario sind:
Komponenten
- Baugruppe A - (geschrieben in C#)
- Baugruppe B - (geschrieben in C++/CLI)
Ausführung des Programms
- Objekt
O
wird erstellt in Montage A . - Objekt
O
wird an eine Funktion innerhalb von Montage B . - Verweis auf das Objekt
O
en Montage A freigegeben wird. - Montage B hält den Verweis auf das Objekt
O
. - Die Ausführung wird beendet (z. B. durch Programmende).
- Montage B gibt den Verweis auf das Objekt frei
O
.
Vielen Dank im Voraus für alle Gedanken zu dieser Frage. Lassen Sie mich wissen, ob weitere Informationen erforderlich sind oder ob etwas nicht klar genug ist.
EDIT
Wie gewünscht, habe ich ein grobes Beispiel für das Szenario geschrieben, das ich zu beschreiben versuche. Die C# y C++/CLI Code kann auf PasteBin gefunden werden.