Jedna rzecz, o której należy pamiętać podczas korzystania z funkcji mono_gchandle_new(), z którą się spotkałem. Zachowa ona tylko obiekt C#, do którego odwołuje się w pamięci, ale jeśli ten obiekt przydzieli inne obiekty, które są nadal przedmiotem procedur czyszczenia pamięci. Fakt, że obiekt, do którego masz dostęp, może mieć uwolnione od ciebie obiekty podrzędne, przysporzył mi sporo kłopotów.
Aktualnie pracuję w systemie mono GC, aby sprawdzić, czy mogę go naprawić, aby traktował te obiekty jako obiekty root.
Jeśli masz za mało obiektów (< 4096), możesz użyć mono_gc_register_root() ... możemy mieć tysiące obiektów, więc nie jest to dobre dla naszych zastosowań.
AKTUALIZACJA: Tak więc nie miałem racji, połączyliśmy się z systemem alokacji obiektów mono i nie przejeliśmy poprawnie zmiennej "atomowej" na funkcje alokacji GC. "Atomowy" oznacza coś innego niż GC, nie ma nic wspólnego z równoczesnym dostępem, to znaczy, że pamięć jest przydzielana jako odniesienie do innych obiektów (atomowej = 0) lub nie (atomowa = 1).
Znam ['gcroot'] (http://msdn.microsoft.com/en-us/library/481fa11f (VS.80) .aspx) dla implementacji Microsoft .NET, ale nie jestem pewien, czy to będzie istniało dla Mono. Wątpię, aby ten interfejs zarządzany na natywnie był przenośny. –
Miałem ten sam problem i rozwiązałem go przez posiadanie statycznego pola po zarządzanej stronie, do której przypisałem obiekt, aby nigdy nie było gromadzone przez gc. –