Встраивание моно - «Фатальная ошибка в GC»: «Слишком много корневых наборов» - PullRequest
0 голосов
/ 28 ноября 2011

Я встраиваю моно в приложение C ++ и связываю его через библиотеку dll, которая затем загружается в приложение через LoadLibrary.

Когда приложение запускается и происходит связывание во время выполнения dll, моно среда выполнения, похоже, не может инициализировать себя сообщением "Too many root sets". Я не уверен, когда и как инициализируется сама среда выполнения (я думал, что это происходит на mono_jit_init, но ошибка выскакивает перед любым вызовом любой из функций mono. Это происходит именно в LoadLibrary, если я попытаюсь загрузить его вручную вместо опираясь на mono.lib библиотеку импорта).

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

Есть какие-нибудь подсказки?

1 Ответ

1 голос
/ 29 ноября 2011

Это может быть ограничением работы Boehm GC в Windows: он подключается к операционной системе во время LoadLibrary, чтобы получать уведомления о созданных потоках и загруженных библиотеках (вот почему вы получаете проблему во время LoadLibrary ()а не в mono_jit_init ()).

Или, возможно, у вас действительно много потоков и библиотек, загруженных к моменту инициализации GC.Если вы свяжете приложение с моно напрямую, проблема исчезнет?Если да, то это должно быть вашим текущим решением проблемы.

В будущем (или при создании моно из git) вы сможете использовать SGen GC, который не должен страдать от этой проблемы.

...