Обходной путь .net домен приложения только передача объектов по значению

StackOverflow https://stackoverflow.com/questions/323212

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

  

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

     

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

     

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top