Embedded Mono: хранение ссылок на объекты C # в C ++ - PullRequest
8 голосов
/ 04 декабря 2011

Я работаю над внедрением моно в приложение, которое я создаю, и я не продвинулся слишком далеко, но одна вещь, которую я не могу найти, это то, как сказать моно, когда я используюобъект и сделано с объектом.

Я хочу сохранить ссылку на объект C # для вызова методов, пока не закончится время жизни его параллельного объекта в C ++, и в этот момент я хочу сказать mono, чтоОбъект C # безопасен для сбора.

Как это сделать?

Ответы [ 3 ]

3 голосов
/ 04 декабря 2011

Похоже, что я ищу это mono_gchandle_new , и держитесь за ручку, а не MonoObject *, и используйте mono_gchandle_get_target, когда мне это нужно.

mono_gchandle_new позволяет вам закреплять при создании дескриптора, но возможно ли закрепить после факта?

0 голосов
/ 23 мая 2014

Используйте System::GCHandle::Alloc и вызовите ToIntPtr результата, чтобы получить токен и защитить объект от сбора. Звоните ToPointer() и сохраняйте как void*.

Используйте System::GCHandle::FromIntPtr, когда вам нужно сопоставить токен с объектом или отпустить его, чтобы он снова был пригоден для сбора.

0 голосов
/ 23 мая 2014

Следует помнить одну вещь при использовании mono_gchandle_new (), с которой я столкнулся ... он будет сохранять только объект C #, на который вы ссылаетесь, в памяти, но если этот объект выделяет другие объекты, на которые все еще распространяются процедуры сборки мусора.Тот факт, что объект, для которого у вас есть дескриптор, может освободить свои подобъекты, вызвал у меня немало проблем.

В настоящее время я копаюсь в моно-системе ГХ, чтобы посмотреть, смогу ли яисправить это так, что он будет рассматривать эти объекты как корневые объекты.

Если у вас мало объектов (<4096), вы можете использовать mono_gc_register_root () ... у нас может быть тысячи объектов, так что это плохо для нашего использования. </p>

ОБНОВЛЕНИЕ:Так что я ошибся в этом, мы подключились к системе выделения моно объектов, и мы неправильно передавали переменную «atomic» в функции выделения GC.«Атомный» означает нечто отличное от GC, он не имеет ничего общего с одновременным доступом, на самом деле это означает, что выделяемая память ссылается на другие объекты (atomic = 0) или нет (atomic = 1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...