Какими способами я могу отправлять данные из плагина через домен приложения, который вызывает событие в основном приложении в C #? - PullRequest
5 голосов
/ 03 февраля 2011

У меня есть основное приложение, которое загружает некоторые плагины. Эти плагины загружаются и запускаются в отдельных доменах приложений с использованием класса, который наследуется от "MarshalByRefObject"; Это все отлично работает.

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

Как лучше всего отправить запрос от плагина через домен приложения к основному приложению?

UPDATE

В качестве обновления вопроса я ищу отправленные данные через домен приложения, которые заставляют основное приложение делать что-то, например, операцию «File-> New» или вызов «GetSomeData ()». При этом мне нужно заставить плагин ждать, пока основное приложение завершит все, что он делает, но также и иметь возможность решить, на стороне основного приложения, выполнять или нет запрошенную функцию / событие.

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

CallbackClass myCallbackClass = new CallbackClass();
pluginInterface.HeresMyCallbackClass((ICallbackClass)myCallbackClass);

плагин получит интерфейс, но любые изменения в исходном классе не распространяются. Итак добавив:

myCallbackClass.MyMainAppEvent += new MainEventHandler(MyMainAppFunction);

не изменит версию события плагина. Плагин может сделать это:

//code within plugin
ICallbackClass callToMainApp;
public HeresMyCallbackClass(ICallbackClass cbClass)
{
    callToMainApp = cbClass;
}

public CallAMainAppFunction()
{
    callToMainApp.CallTheSubscribedFunction(); //This is where it all goes wrong
}

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

CallbackClass myCallbackClass = new CallbackClass();
myCallbackClass.MyMainAppEvent += new MainEventHandler(MyMainAppFunction); //Subscribe first
pluginInterface.HeresMyCallbackClass((ICallbackClass)myCallbackClass);

Плагин может вызвать CallTheSubscribedFunction(), и событие будет запущено в основном приложении. Мне нужно иметь возможность подписаться на подобные события по требованию, потому что некоторые вещи / события / данные в основном приложении доступны в разное время.

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

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

Обновление 2

Я понимаю, что приведенная выше информация относится только к моему приложению, но я также ищу общие предложения. Итак, если использование потоков является опцией, дайте мне знать, как может работать общий случай. Если другой случай сработает лучше, и мне нужно сделать редизайн для его реализации, дайте мне знать об этом. Просто ищу предложения здесь. Спасибо.

Ответы [ 2 ]

1 голос
/ 08 февраля 2011

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

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

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

Имеет ли это смысл?

0 голосов
/ 04 февраля 2011

Убедитесь, что ваш CallbackClass наследуется от MarshalByRefObject . В противном случае копия класса обратного вызова будет создана на другой стороне границы домена приложения, что сделает невозможным обмен данными между доменами.

...