Pull to refresh

Comments 23

Я в MEF особо не разбирался, но насколько я понял он не позволяет такую изолированность
MEF много, что позволяет. И для вашей задачи его тоже можно использовать — надо только внимательно посмотреть, где и что перехватить.
Собственно, кажется, достаточно сделать свой ExportProvider (возможно, еще свой ComposablePartCatalog) — и все.
UFO landed and left these words here
а что же тогда использовать для связи между доменами? WCF с NetPipeBinding? Но тогда мы не можем быть уверены в том что это именно наш плагин, а не сторонняя программа решила с нами поиграть
Ну WCF и шел на замену. А вообще для этих дел MEF, если у Вас больше SOA — то WCF.
Делал раньше систему аналогичную тому, что Вы описали в топике и кидаю камень в огород тех, кто забыл сделать:
bool Assembly.TryParse(string, out Assembly)
а где вы взяли Assembly.TryParse? я ни в msdn ни в гугле не нашел???
А MEF позволяет вклиниться в ход чего нибудь и переопределить?
Я как раз и говорю, камень в огород тех, кто забыл добавить метод TryParse в класс Assembly.
По поводу «поиграть» — если у Вас открытый API и плагины может делать любой — любого контракта уже хватает.
Я имел в виду что любая левая программа сможет подключиться по wcf, без контроля ядра так сказать
Передавайте уникальный токен ядром тем плагинам, которые ядро само пускать будет, тем более — это и потом может пригодиться ещё.
Я тоже об это подумал сразу, но мы опять прибегаем к Remoting-у :)
Вообще, если может чужая программа что-то испортить, то что будет мешать подключить плагин и что-то испортить?
Вообще использовать WCF для плагинов на мой взгляд немного жутко, ибо есть куда более специализированные вещи. Но чем например не вариант хотябы — компилить плагины в .exe и передавать токен через аргументы при запуске?
«Но тогда мы не можем быть уверены в том что это именно наш плагин, а не сторонняя программа решила с нами поиграть „
Самим активировать плагины, соответствующие заданным критериям, а программе выступать только клиентом, а не сервером.
UFO landed and left these words here
А как у вас осуществляется взаимодействие плагина и родительской программы? Не очень понятно как в такой структуре выполняется подписка на ивенты плагина, дергание колбэков у родителя, например чтобы отобразить прогресс обработки которую выполняет плагин в родительском приложении?
Хочу сделать продолжение в котором опишу вариант взаимодействия.
Самый простой вариант что ядро в методе Initialize передает плагину объект для взаимодействия с ядром и у этого объекта к примеру может быть метод SendMessage(Message msg) и такой же метод у Plugin. А передавать в месседже можно все что сериализуемо (как минимум любой объект из mscorlib.dll)
Вашего кода во многом не понял:
***
string[] nameSplit = e.Name.Split(',');
string path = Path.Combine(SearchFolder, nameSplit[0] + ".dll");
***
Может AssemblyName заюзать?

***
catch (Exception exc)
{
Exception exp = exc;
throw;
}
***
А зачем создавать exp, а потом пробрасывать его дальше?

***
if (loadedAssembly != null)
{
return loadedAssembly;
}
else
{
return null;
}
***

Может лучше «return loadedAssembly;»?

AssemblyName заюзать не получается, потому что мы ищем сборку в другой директории "\plugins\plugin1" а у домена куда будет загружаться эта сборка указан путь в корень. Методом Load мне так и не удалось воспользоваться, по-этому я загружаю вот так.

Остальное это мусор который я забыл стереть.
если в методе загрузки сборки не возвращать ексепшен тогда мы в этот метод можем заходить очень долго по кругу.
… а еще не очень понятно, зачем вы загружаете PluginFramework для рефлексии, если у вас на нее все равно референс стоит, и она у вас подгружена. Что мешает typeof(Plugin) сказать?

PS А еще в assemblyHelper не нужно поле _currentDomain, вы же с ним не делаете ничего.
1)просто typeof(Plugin) и потом его сравнить с типом из сборки которая загружена для рефлексии получается что это два разных типа. Я сначала не понимал в чем проблема, но когда PluginFramework загрузил только для рефлексии взял из неё тип и сравнил все заработало.
2)Да поля можно было и не делать
Sign up to leave a comment.

Articles