Обходной путь .net домен приложения только передача объектов по значению - PullRequest
2 голосов
/ 27 ноября 2008

Я занимаюсь разработкой приложения .net, которое сильно зависит от плагинов. Само приложение содержит соединение с удаленным сервером.

Недавно я покопался в доменах приложений и считаю их идеальным решением для изоляции кода плагина от остальной части приложения.

Однако есть один большой недостаток, который делает меня неспособным реализовать домены приложений для размещения плагинов. Кажется, что нет способа передать объект по ссылке на другой домен приложения, который необходим для передачи ссылки на объект соединения.

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

Примечание: о создании прокси не может быть и речи, уровень соединения уже действует как прокси, поскольку классы создаются автоматически.

Примечание 2: System.AddIn нельзя использовать, так как он недоступен в компактной среде.

Ответы [ 3 ]

5 голосов
/ 27 ноября 2008

Вы пробовали получить от MarshalByRefObject ? Это боль в том, что это портит вашу иерархию наследования, но я думаю, что это то, что вы хотите.

Из документов:

MarshalByRefObject - базовый класс для объектов, которые общаются через границы домена приложения по Обмен сообщениями с использованием прокси. Объекты, которые не наследуются от MarshalByRefObject неявно маршал по значению. Когда пульт приложение ссылается на маршала значение объекта, копия объекта передается через домен приложения границы.

Объекты MarshalByRefObject доступ непосредственно в границы локального приложения домен. Первый раз приложение в удаленном домене приложений получает доступ к MarshalByRefObject, прокси передается в удаленное приложение. Последующие звонки на прокси вернулись к объекту проживания в локальном домене приложений.

Типы должны наследоваться от MarshalByRefObject, когда тип используется во всем домене приложения границы и состояние объект не должен быть скопирован, потому что члены объекта не могут быть использованы вне домена приложения, где они были созданы.

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

1 голос
/ 27 ноября 2008

Чтобы общаться с одним и тем же экземпляром между доменами приложений, он должен наследоваться от MarshalByRefObject . Сделанный таким образом, каждый вызов метода к объекту (включая свойства и т. Д.) На самом деле является удаленным вызовом другого домена приложения. Это помогает?

0 голосов
/ 27 ноября 2008

Имейте в виду, что очистка MarshalByRefObject прокси очищается на основе аренды. Короче говоря, если вы не используете объект в течение определенного времени, он будет восстановлен. Вы можете управлять этим путем переопределения InitializeLifetimeService для возврата объекта аренды, который соответствует вашим потребностям. Если вы вернете null, вы фактически отключите лизинг, и тогда объект будет освобожден только после выгрузки домена приложения.

...