.NET remoting - как определить, есть ли еще ссылка на удаленный объект в соседнем домене приложений? - PullRequest
1 голос
/ 01 ноября 2011

У меня есть приложение, которое использует .NET Remoting для загрузки плагинов в другой домен приложения (в рамках того же процесса). Это сделано потому, что плагины должны быть выгружены.

Время от времени я получаю исключение в главном домене приложения, что удаленный объект (унаследованный от MarshalByRefObject) в домене плагина был подвергнут сборке мусора. Поскольку я контролирую код как для плагинов, так и для самого приложения, я могу изменить код с обеих сторон в поисках решения.

Первая идея заключалась в предоставлении бесконечной аренды для этих объектов. Это работает, но жизнеспособно только для нескольких глобальных объектов, которые всегда будут там. Другие объекты могут стать довольно загруженными памятью, и я на самом деле хочу собрать их мусором - когда основной домен приложения будет сделан с ними, конечно.

Одним из возможных решений является реализация IDisposable и переход к возврату истекшей аренды для удаленных объектов. Однако для этого требуется, чтобы я усердно Dispose() все экземпляры этих объектов, которые я когда-либо использовал. Немного кода, чтобы перейти и исправить.

Так что мне было интересно, есть ли другой способ? Я попытался реализовать Finalizer, но он, кажется, работает только на удаленном домене приложения, независимо от того, был ли объект упорядочен по значению или по ссылке. Есть ли способ обнаружить, что локальная оболочка собирается собирать мусор, и затем каким-то образом пометить удаленный объект как «свободный для сборки мусора»?

...