Советник с DLL на С# вылетает - страница 3

 
Максим Пругло:

И он отказывается работать, зараза.. 

попробуйте 

WebClient wc

в глобальную область видимости вынести и модификатор статик добавьте - возможно, что объект не успевает в рантайм создаваться


тут, в общем какой принцип - объявляете все объекты с модификатором статик, затем при запуске потока создаете все экземпляры объектов и контролируете из MQL? что инициализация экземпляров объектов произошла - если кто ==null , значит подождем

ЗЫ: 5 секунд это много, менее секунды происходит компиляция и запуск .Net - даже на виртуалке

ЗЫЗЫ: как вариант запустите окошко с WinForm - принцип тот же, что в моем примере, получится - двигайтесь дальше ;)

 

не, ему похоже сам поток создавать не по душе, так как я полностью убрал всё из функции GetSiteInfo, оставив её пустой, а не заработало.

ЗЫ Принцип-то я понял))

 
Максим Пругло:

не, ему похоже сам поток создавать не по душе, так как я полностью убрал всё из функции GetSiteInfo, оставив её пустой, а не заработало.

глянул повнимательнее Ваш пример - уберитете делегат и сделайте как в моем примере, я кажется первый раз так как Вы писал, и тоже не получилось запустить поток

 
глазам своим не верю, работает... ну, может кому тоже ещё пригодится эта тема - не видел ничего подобного на каких-либо сайтах, а здесь уже прямо как подробная инструкция))) спасибо, что потратили на меня столько своего времени)))))
 
хотя как ни странно, именно с этого сайта, который мне нужен - всё равно почему-то не качает его текст(( в C# с этим же кодом скачивает, а здесь в ошибку уходит, я добавил там try catch.. но это видать уже какая-то совсем другая история, хотя должно быть всё равно как-то связано с экспортируемостью
 

пожалуйста 

;)

Максим Пругло:
хотя как ни странно, именно с этого сайта, который мне нужен - всё равно почему-то не качает его текст(( в C# с этим же кодом скачивает, а здесь в ошибку уходит, я добавил там try catch.. но это видать уже какая-то совсем другая история, хотя должно быть всё равно как-то связано с экспортируемостью

я не знаю как работает сама виртуальная машина .Net , как впрочем и не знаю как происходит запуск .dll из под MQL4

могу лишь предполагать, что различного рода "траблы" возникают из-за выделения памяти - возможно, что используется память МТ ? ...не знаю, гадать тоже устал.... возможно очень не надежная работа при использовании 32-х разрядного МТ4, который вызывает 32-х разрядную .dll на C# и все работает под 64-хразрядной Вин , да еще поток отдельный запущен.... да еще работа всего .Net в рантайме с его зависимостями....


но еще раз - все, что "не взлетело" - оборачивайте в отдельные потоки и запускайте, если работает, то будет и при вызове из МТ4 так же работать - т.е. тестируйте сначала как консольное приложение C# с несколькими потоками, получилось - используйте код в виде .dll


ЗЫ: если все будет вообще совсем грустно - запустите WinForm форму/окно и в его коде запустите все, что  не получилось запустить другими способами - будет работать все на 100% !!! .... но это не точно!  )))  - я больше недели не мог запустить копирование в буфер обмена, прочитал мануалов стопяцот - но почему то без проблем получилось использовать RichEdit даже без прикрепления к форме, в качестве буфера - буфера обмена.... в общем, что там за столько лет создали Мелкомягкие - никто уже не знает почему и как компоненты работают или не работают как должны )))


ЗЫЗЫ: я .Net 4.7.2 стараюсь использовать для МТ4 - в 99.9 % будет работать без проблем, с другими версиями не всегда все гладко проходит при экспорте для MT4 .... хотя быстрее все писать под МТ5 - но задачи разные бывают


удачи!

 

Ну ясно... Хотя вот даже банально, чтобы логически понять: как МТ4 может работать по моей DLL Test2, которая размером 7кб и при этом использовать функции HtmlAgilityPack.dll, которая сама по себе размером на порядок выше?

У меня там для разбора сайта есть строчки дальше в функции GetSiteInfo() :

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(NewsPage);
var items = doc.DocumentNode.SelectNodes("//tr[@data-event-datetime]");

и так далее. Это ж невозможно, надо как-то куда-то по идее эту нужную для работы DLL Агилити добавлять.. или нет.....?

Файлы:
 
Максим Пругло:

и так далее. Это ж невозможно, надо как-то куда-то по идее эту нужную для работы DLL Агилити добавлять.. или нет.....?

Costura Fody

 

Получилось идеально то, что было нужно! Costura Fody+обработка всех исключений+достаточное время на создание всех объектов; вот здесь

int cnt = 30;
while(!SaveSiteText() && cnt-- > 0) Sleep(100);

значение 30 изменил на 100 и все глюки ушли

единственное - срабатывает единожды; потом только перезапуск терминала вручную, чтобы функция снова отрабатывала; может это связано как-то с тем, что неудалённый процесс где-то висит.. судя по Вашему коду мы его нигде не уничтожили; в каком месте кода это лучше сделать? хотя может какая-то другая причина.. заметил, что когда отключаешь советника, оставляя терминал открытым, файл Test2.dll продолжает использоваться терминалом (его невозможно удалить)
 

большое время у Вас на запуск .Net - подозреваю, что Вы сразу и обьекты инициализируете и используете их, чтобы выполнить запрос к серверу

я делю код на инициализацию, затем на необходимые мне функции, затем на остановку потока и уничтожение обьектов - писал выше https://www.mql5.com/ru/forum/364280/page2#comment_21156513

на запуск и на остановку потока нужно предоставлять время .Net

ЗЫ: не все пакеты .Net могут быть выгружены после вызова из МТ4 , иногда бывает, что повторно .dll не запускается без перезагрузки терминала, в МТ5 аналогичные пакеты .Net будут работать без проблем - не разбирался, да и сомневаюсь, что решу этот вопрос, думаю, что архитектура МТ4  так работает