VassilSanych
|
Дата: 26.03.2013
Динамическая подгрузка dll. Динамическое конфигурирование.
|
|
|
|
Mikhail Sukhov
|
Дата: 26.03.2013
Макс  Как запускать несколько стратегий через quik ? Если мне надо поправить одну, то приходиться все выключать и перезапускать после правки. 2-й quik не выход т.к. если будет 3-4 стратегии.
Есть какие то варианты, чтобы можно было остановить одну стратегию, ее поправить и перезапустить в то время как остальные продолжают работать? Студия?
|
|
|
|
Макс
|
Дата: 26.03.2013
VassilSanych  Динамическая подгрузка dll. Динамическое конфигурирование. есть пример? не умею это делать.
|
Автор топика
|
|
|
Макс
|
Дата: 26.03.2013
Студия?[/quote] нет 4.1.7 давно работает один робот, хочу 2-й алгоритм добавить не трогая 1-й.
|
Автор топика
|
|
|
Moadip
|
Дата: 26.03.2013
Если стратегия "вживлена" в оболочку через которую запускается робот, то придется переписывать. Механизм примерно такой: Есть dll в которой лежат классы стратегий, как вариант на каждую стратегию отдельная dll. В оболочке подгружается данная либа. Через рефлексию вытаскиваются типы(классы стратегий). Создаются и запускаются стратегии. В итоге получается стратегию можно отлаживать отдельно(если она в отдельной dll) пока работает бот. И потом в любой момент подгрузить эту dll, создать и запустить стратегию вместе с текущей. Макс  VassilSanych  Динамическая подгрузка dll. Динамическое конфигурирование. есть пример? не умею это делать. На codeplex лежат исходники гидры. Источники сделаны в виде плагинов - dll, которые подгружаются при запуске, затем через рефлексию берутся типы(классы) и создаются объекты.
|
|
|
|
VassilSanych
|
Дата: 27.03.2013
Макс  есть пример? не умею это делать. Код
var strategyLib = Assembly.LoadFrom(Path.Combine(dir, fileName));
var strategyType = strategyLib.GetExportedTypes()
.FirstOrDefault(x =>
typeof(IStrategyFactory).IsAssignableFrom(x));
if (strategyType != null)
{
var strategyFactory = (IStrategyFactory)strategyLib
.CreateInstance(strategyType.FullName);
return strategyFactory.Create();
}
else
throw new NotImplementedException("strategyLib does not implement IStrategyFactory");
|
|
|
|
esper
|
Дата: 27.03.2013
Динамическая подгрузка это конечно хорошо, но нельзя просто так выгрузить ранее загруженную сборку, а значит нельзя и повторно ее загрузить после правки.
|
|
|
|
Макс
|
Дата: 27.03.2013
А кто-нибудь торгует несколько стратегий через quik? Как Вы это реализовали?
|
Автор топика
|
|
|
VassilSanych
|
Дата: 27.03.2013
esper  Динамическая подгрузка это конечно хорошо, но нельзя просто так выгрузить ранее загруженную сборку, а значит нельзя и повторно ее загрузить после правки. Можно загрузить её под другим именем
|
|
|
|
VassilSanych
|
Дата: 27.03.2013
Ещё можно: - использовать MEF- Shadow Copy, как в ASP.NET - - собственно можно напрямую использовать ASP.NET. Это добавит системе устойчивости. - отдельный AppDomain (правда придётся налаживать междоменное взаимодействие) - использовать скрипты В любом случае необходимо профилировать память на предмет хвостов от использованного кода. Иначе течь будет обязательно.
|
|
|
|
esper
|
Дата: 27.03.2013
VassilSanych  Можно загрузить её под другим именем Что именно имеется ввиду? Extern alias?
|
|
|
|
VassilSanych
|
Дата: 27.03.2013
esper  VassilSanych  Можно загрузить её под другим именем Что именно имеется ввиду? Extern alias? Нет. Просто тупо подложить переименованную сборку. (предположение. не пробовал) PS Extern alias вроде как для references, а мы их обходим.
|
|
|
|
esper
|
Дата: 27.03.2013
VassilSanych  Нет. Просто тупо подложить переименованную сборку. (предположение. не пробовал) Было бы прикольно, если бы работало  А Extern alias это на этапе добавления ссылок. - MEF, скорее всего, так же не поможет.
- Можно загружать стратегии в отдельный AppDomain, но будет много проблем с маршалингом данных и не ясно, что с производительностью.
- Скрипты отличный вариант, лучше даже просто CodeDomProvider использовать
А можно просто использовать S#.Studio, где этот функционал идет из коробки.
|
|
|
|
Макс
|
Дата: 27.03.2013
Всем спасибо за советы. Но все это теория. А есть кто-нибудь реально торгющий несколько стратегий через quik ?
Мне еще приходит идея сделать типа шлюза, который будет подключаться к квику, а все остальные роботы будут подключаться к шлюзу, получать данные и отправлять туда заявки, но все это велосипед, который не хочется изобретать...
|
Автор топика
|
|
|
VassilSanych
|
Дата: 27.03.2013
Макс  но все это велосипед, который не хочется изобретать... Велосипед изобретать придётся по-любому. Потому что во-первых это уже вопрос конечной реализации, а она у каждого своя - по своим отдельным требованиям. А во-вторых, можно конечно поискать, кто её вам бесплатно откроет, но я бы не надеялся.
|
|
|
|
VassilSanych
|
Дата: 27.03.2013
esper  VassilSanych  Нет. Просто тупо подложить переименованную сборку. (предположение. не пробовал) Было бы прикольно, если бы работало  А Extern alias это на этапе добавления ссылок. Заинтриговали меня. Проверил. Нормально работает загрузка двух стратегий из двух копий одной библиотеки. В том-то и дело, что ссылок у нас никаких нет при динамической загрузке.
|
|
|
|
esper
|
Дата: 27.03.2013
VassilSanych  Заинтриговали меня. Проверил. Нормально работает загрузка двух стратегий из двух копий одной библиотеки. В том-то и дело, что ссылок у нас никаких нет при динамической загрузке. Получается, что при загрузке только имя файла проверяется, FullName для сборки может быть один и тот же?
|
|
|
|
VassilSanych
|
Дата: 27.03.2013
esper  Получается, что при загрузке только имя файла проверяется, FullName для сборки может быть один и тот же? Хрен его знает. Ковырял рефлектором. Дальше определённого уровня не пускает посмотреть. Причём LoadFrom не ругается, но грузит прошлую сборку. А LoadFile грузит новую.
|
|
|
|
VassilSanych
|
Дата: 28.03.2013
PS Кстати Assembly.LoadFile dll не лочит. Но повторно не загружает. Так что переименовывать-таки надо. Некоторые особенности: Assembli.LoadFrom загружает референсные библиотеки из целевой папки Assembly.LoadFile загружает референсные библиотеки из стартовой папки
|
|
|
|
VassilSanych
|
Дата: 31.03.2013
esper  А можно просто использовать S#.Studio, где этот функционал идет из коробки. Спасибо, не надо. Имея небольшой опыт работы с Гидрой, я уже имею премирное представление о том, что там может копошиться в коробке Studio. Даже пробовать не буду.
|
|
|