а что же тогда использовать для связи между доменами? WCF с NetPipeBinding? Но тогда мы не можем быть уверены в том что это именно наш плагин, а не сторонняя программа решила с нами поиграть
Ну WCF и шел на замену. А вообще для этих дел MEF, если у Вас больше SOA — то WCF.
Делал раньше систему аналогичную тому, что Вы описали в топике и кидаю камень в огород тех, кто забыл сделать:
Вообще, если может чужая программа что-то испортить, то что будет мешать подключить плагин и что-то испортить?
Вообще использовать WCF для плагинов на мой взгляд немного жутко, ибо есть куда более специализированные вещи. Но чем например не вариант хотябы — компилить плагины в .exe и передавать токен через аргументы при запуске?
«Но тогда мы не можем быть уверены в том что это именно наш плагин, а не сторонняя программа решила с нами поиграть „
Самим активировать плагины, соответствующие заданным критериям, а программе выступать только клиентом, а не сервером.
А как у вас осуществляется взаимодействие плагина и родительской программы? Не очень понятно как в такой структуре выполняется подписка на ивенты плагина, дергание колбэков у родителя, например чтобы отобразить прогресс обработки которую выполняет плагин в родительском приложении?
Хочу сделать продолжение в котором опишу вариант взаимодействия.
Самый простой вариант что ядро в методе Initialize передает плагину объект для взаимодействия с ядром и у этого объекта к примеру может быть метод SendMessage(Message msg) и такой же метод у Plugin. А передавать в месседже можно все что сериализуемо (как минимум любой объект из mscorlib.dll)
AssemblyName заюзать не получается, потому что мы ищем сборку в другой директории "\plugins\plugin1" а у домена куда будет загружаться эта сборка указан путь в корень. Методом Load мне так и не удалось воспользоваться, по-этому я загружаю вот так.
Остальное это мусор который я забыл стереть.
если в методе загрузки сборки не возвращать ексепшен тогда мы в этот метод можем заходить очень долго по кругу.
… а еще не очень понятно, зачем вы загружаете PluginFramework для рефлексии, если у вас на нее все равно референс стоит, и она у вас подгружена. Что мешает typeof(Plugin) сказать?
PS А еще в assemblyHelper не нужно поле _currentDomain, вы же с ним не делаете ничего.
1)просто typeof(Plugin) и потом его сравнить с типом из сборки которая загружена для рефлексии получается что это два разных типа. Я сначала не понимал в чем проблема, но когда PluginFramework загрузил только для рефлексии взял из неё тип и сравнил все заработало.
2)Да поля можно было и не делать
Пример системы плагинов