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

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

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
2 756
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

MarshalByRefObject is the base class for objects that communicate across application domain boundaries by exchanging messages using a proxy. Objects that do not inherit from MarshalByRefObject are implicitly marshal by value. When a remote application references a marshal by value object, a copy of the object is passed across application domain boundaries.

MarshalByRefObject objects are accessed directly within the boundaries of the local application domain. The first time an application in a remote application domain accesses a MarshalByRefObject, a proxy is passed to the remote application. Subsequent calls on the proxy are marshaled back to the object residing in the local application domain.

Types must inherit from MarshalByRefObject when the type is used across application domain boundaries, and the state of the object must not be copied because the members of the object are not usable outside the application domain where they were created.

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

Я вижу, как это может испортить мою иерархию наследования. Я проверю, спасибо.

Stormenet 27.11.2008 11:35

Что ж, я попробовал, и это выглядело многообещающе. Но большинство плагинов возвращают пользовательский элемент управления, который должен быть размещен в основном приложении, и это кажется действительно сложным: s

Stormenet 27.11.2008 11:55

Да, работать с междоменным пользовательским интерфейсом действительно сложно. Вы смотрели на материал .NET 3.5 System.AddIn? Не знаю, пригодится оно вам или нет, но, наверное, стоит посмотреть ... blogs.msdn.com/zifengh

Jon Skeet 27.11.2008 12:27

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

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

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