Comments 23
Он по факту мёртв ещё с .net 3.0.
а что же тогда использовать для связи между доменами? WCF с NetPipeBinding? Но тогда мы не можем быть уверены в том что это именно наш плагин, а не сторонняя программа решила с нами поиграть
Ну WCF и шел на замену. А вообще для этих дел MEF, если у Вас больше SOA — то WCF.
Делал раньше систему аналогичную тому, что Вы описали в топике и кидаю камень в огород тех, кто забыл сделать:
Делал раньше систему аналогичную тому, что Вы описали в топике и кидаю камень в огород тех, кто забыл сделать:
bool Assembly.TryParse(string, out Assembly)
По поводу «поиграть» — если у Вас открытый API и плагины может делать любой — любого контракта уже хватает.
Я имел в виду что любая левая программа сможет подключиться по wcf, без контроля ядра так сказать
Передавайте уникальный токен ядром тем плагинам, которые ядро само пускать будет, тем более — это и потом может пригодиться ещё.
Я тоже об это подумал сразу, но мы опять прибегаем к Remoting-у :)
Вообще, если может чужая программа что-то испортить, то что будет мешать подключить плагин и что-то испортить?
Вообще использовать WCF для плагинов на мой взгляд немного жутко, ибо есть куда более специализированные вещи. Но чем например не вариант хотябы — компилить плагины в .exe и передавать токен через аргументы при запуске?
Вообще использовать WCF для плагинов на мой взгляд немного жутко, ибо есть куда более специализированные вещи. Но чем например не вариант хотябы — компилить плагины в .exe и передавать токен через аргументы при запуске?
«Но тогда мы не можем быть уверены в том что это именно наш плагин, а не сторонняя программа решила с нами поиграть „
Самим активировать плагины, соответствующие заданным критериям, а программе выступать только клиентом, а не сервером.
Самим активировать плагины, соответствующие заданным критериям, а программе выступать только клиентом, а не сервером.
А как у вас осуществляется взаимодействие плагина и родительской программы? Не очень понятно как в такой структуре выполняется подписка на ивенты плагина, дергание колбэков у родителя, например чтобы отобразить прогресс обработки которую выполняет плагин в родительском приложении?
Хочу сделать продолжение в котором опишу вариант взаимодействия.
Самый простой вариант что ядро в методе Initialize передает плагину объект для взаимодействия с ядром и у этого объекта к примеру может быть метод SendMessage(Message msg) и такой же метод у Plugin. А передавать в месседже можно все что сериализуемо (как минимум любой объект из mscorlib.dll)
Самый простой вариант что ядро в методе 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;»?
***
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, вы же с ним не делаете ничего.
PS А еще в assemblyHelper не нужно поле _currentDomain, вы же с ним не делаете ничего.
Sign up to leave a comment.
Пример системы плагинов