Я разрабатываю приложение .net, которое сильно зависит от плагинов. Само приложение содержит подключение к удаленному серверу.
Недавно я покопался в доменах приложений и увидел в них идеальное решение для изоляции кода плагина от остальной части приложения.
Однако есть один большой недостаток, из-за которого я не могу реализовать домены приложений для размещения плагинов. Кажется, что нет способа передать объект по ссылке в другой домен приложения, который необходим для передачи ссылки на объект соединения.
Я надеялся, что кто-то может предложить мне обходной путь, чтобы я мог передать ссылку на этот объект.
Примечание: о создании прокси-сервера не может быть и речи, уровень подключения уже действует как прокси, поскольку классы генерируются автоматически.
Примечание 2: System.AddIn нельзя использовать, так как он недоступен в компактной платформе.





Вы пробовали производный от 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, предпочтительно ограничивая себя операциями, которые требуют только примитивных типов, строк и массивов того и другого. Это может быть связано с моей собственной неопытностью в работе с несколькими доменами приложений, но это просто предупреждение о том, что это своего рода минное поле.
Что ж, я попробовал, и это выглядело многообещающе. Но большинство плагинов возвращают пользовательский элемент управления, который должен быть размещен в основном приложении, и это кажется действительно сложным: s
Да, работать с междоменным пользовательским интерфейсом действительно сложно. Вы смотрели на материал .NET 3.5 System.AddIn? Не знаю, пригодится оно вам или нет, но, наверное, стоит посмотреть ... blogs.msdn.com/zifengh
Чтобы общаться с одним и тем же экземпляром между доменами приложений, он должен наследовать от MarshalByRefObject. Таким образом, каждый вызов метода объекта (включая свойства и т. д.) На самом деле является удаленным вызовом другого домена приложения. Это поможет?
Имейте в виду, что очистка прокси-серверов MarshalByRefObject выполняется на основе аренды. Короче говоря, если вы не используете объект в течение определенного времени, он будет возвращен. Вы можете контролировать это, переопределив InitializeLifetimeService, чтобы он возвращал объект аренды, который вам нужен. Если вы вернете null, вы фактически отключите аренду, и тогда объект будет восстановлен только при выгрузке AppDomain.
Я вижу, как это может испортить мою иерархию наследования. Я проверю, спасибо.