В настоящее время я изучаю использование C ++ / CLI для преодоления разрыва между управляемым C # и собственным неуправляемым кодом C ++.Одна конкретная проблема, которую я хочу решить, - это преобразование типов данных, которые отличаются в C # и C ++.
Читая об использовании такого мостового подхода и связанных с этим последствиях для производительности, я удивился, какСборка мусора будет работать.В частности, как сборщик мусора будет обрабатывать объекты, созданные с обеих сторон, если на них ссылаются / уничтожают «с другой стороны».
До сих пор я читал различные статьи и вопросы на форуме по StackOverflow и MSDN , что привело меня к мысли, что сборщик мусора должен работать с обоими типами кода при работе в одном и том же процессе - т.е. если объект был создан в C # и передан вМост C ++ / CLI, он не будет собираться до тех пор, пока ссылки на обе стороны больше не будут использоваться.
Мой вопрос в этом случае разбивается на три части:
- AmЯ прав в заключении, что сборщик мусора работает в обеих частях кода (C # и C ++ / CLI) при запуске в одном и том же процессе?
- По отношению к 1: как он работает в таких обстоятельствах (особенно вусловия очистки объектов, на которые ссылаются обе базы кода).
- Есть ли какие-либо предложения о том, как контролировать активностьСборщик мусора - т.е. написание тестов для проверки, когда происходит сборка мусора;или программа, которая следит за сборщиком мусора.
У меня уже есть понимание того, как работает сборщик мусора в целом, поэтому мои вопросы здесь относятся к следующему сценарию:
Компоненты
- Сборка A - (написано на C #)
- Сборка B - (написано на C ++ / CLI)
Выполнение программы
- Объект
O
создан в Сборка A . - Объект
O
передается в функцию внутри Сборка B . - Ссылка на объект
O
в Сборка A освобождается. - Сборка B удерживает ссылку на объект
O
. - Выполнение заканчивается (т. Е. При выходе из программы).
- Сборка B освобождает ссылку наobject
O
.
Заранее спасибо за любые мысли по этому вопросу.Дайте мне знать, если необходима дополнительная информация или что-то не совсем понятно.
РЕДАКТИРОВАТЬ
В соответствии с запросом, я написал пример грубого сценария I 'Я пытаюсь описать.Код C # и C ++ / CLI можно найти в PasteBin.