У меня есть основное приложение, которое загружает некоторые плагины. Эти плагины загружаются и запускаются в отдельных доменах приложений с использованием класса, который наследуется от "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
Я понимаю, что приведенная выше информация относится только к моему приложению, но я также ищу общие предложения. Итак, если использование потоков является опцией, дайте мне знать, как может работать общий случай. Если другой случай сработает лучше, и мне нужно сделать редизайн для его реализации, дайте мне знать об этом. Просто ищу предложения здесь. Спасибо.