Una cosa da tenere a mente quando si utilizza mono_gchandle_new() che ho incontrato .. manterrà solo l'oggetto C# a cui si fa riferimento in memoria, ma se quell'oggetto alloca altri oggetti questi sono ancora soggetti alle routine di garbage collection. Il fatto che un oggetto per il quale hai una maniglia, possa avere i suoi sotto oggetti liberati su di te mi ha causato un po 'di problemi.
Attualmente sto scavando nel sistema GC mono per vedere se riesco a correggerlo in modo che tratterà quegli oggetti come oggetti radice.
Se si dispone di un numero di oggetti sufficiente (< 4096), è possibile utilizzare mono_gc_register_root() ... possiamo avere migliaia di oggetti, quindi questo non va bene per i nostri usi.
AGGIORNAMENTO: Quindi non ero corretto su questo, ci eravamo agganciati al sistema di assegnazione degli oggetti mono e non stavamo passando la variabile "atomica" correttamente sulle funzioni di allocazione GC. "Atomico" significa qualcosa di diverso dal GC, non ha nulla a che fare con l'accesso concorrente, in realtà significa che la memoria assegnata fa riferimento ad altri oggetti (atomico = 0) o no (atomico = 1).
fonte
2014-05-23 18:47:05
Conosco ['gcroot'] (http://msdn.microsoft.com/en-us/library/481fa11f (VS.80) .aspx) per l'implementazione .NET di Microsoft, ma non sono sicuro se questo esisterà per Mono. Dubito che questa interfaccia gestita possa essere portabile. –
Ho avuto lo stesso problema e l'ho risolto avendo un campo statico sul lato gestito a cui ho assegnato l'oggetto in modo che non venisse mai raccolto. –