Вызов функции DLL-обёртки на C++/CLI для C# вызывает критическую ошибку и прекращение выполнения советника.

 

Суть в том, что мне нужно вызывать функции библиотеки C++/CLI, которая будет обращаться к программе на C# и взаимодействовать с ней.

Падение происходит только если функция на С++ обращается к классам из C# библиотеки. Если их убрать, а оставить только код C++, то советник работает нормально и функция вызывается как надо.

Проблема скорее всего связана именно с терминалом, т.к. я тестировал вызовы функции с помощью другого проекта на C++ и ошибок никаких не возникало. Пробовал также DllExport непосредственно из C#, но это тоже не работает.


Бинарники, скрипт и код проекта прилагаю. Если предложите другой более удобный вариант взаимодействия с терминалом, буду рад. Требуется именно двухсторонний обмен данными.

Файлы:
Expert.zip  2268 kb
 
Мы работаем над нативным импортом дотнет библиотек по аналогии с обычными dll.

Скорее всего в следующем релизе будет.
 
Renat Fatkhullin:
Мы работаем над нативным импортом дотнет библиотек по аналогии с обычными dll.

Скорее всего в следующем релизе будет.

Это очень приятная новость! А когда примерно этот релиз выйдет?


Почему не проще организовать что-то вроде локального сервиса (можно даже WCF) с возможностью взаимодействия через именованные каналы? Это сразу решит проблемы взаимодействия с терминалом практически на любом языке. Вот представьте, пользователь подключил в своё ПО этот сервис, подписался на CallBack функции типа OnCalculate или OnTick и может управлять ордерами, строить индикаторы и получать котировки прямо из своего ПО, вызывая функции сервиса. Очень удобно.

 
Anton_M:

Суть в том, что мне нужно вызывать функции библиотеки C++/CLI, которая будет обращаться к программе на C# и взаимодействовать с ней.

Падение происходит только если функция на С++ обращается к классам из C# библиотеки. Если их убрать, а оставить только код C++, то советник работает нормально и функция вызывается как надо.

Проблема скорее всего связана именно с терминалом, т.к. я тестировал вызовы функции с помощью другого проекта на C++ и ошибок никаких не возникало. Пробовал также DllExport непосредственно из C#, но это тоже не работает.


Бинарники, скрипт и код проекта прилагаю. Если предложите другой более удобный вариант взаимодействия с терминалом, буду рад. Требуется именно двухсторонний обмен данными.

"Пробовал также DllExport непосредственно из C#, но это тоже не работает." - как это не работает? Специально только что проверил и убедился что все работает превосходно. Уже более полугода использую этот метод для написания dll на c#.

В настоящий момент имеется единственная проблема: обратная связь с МТ. То есть вызвать что-то в МТ или оповестить МТ из внешней программы.

Проверять по таймеру или на каждом тике наличия сообщения для МТ - это большой костыль.

Будем надеяться что разработчики этот вопрос решат. Тогда можно будет делать любые расширения для МТ.

 
В следующем релизе будет родная поддержка дотнета.

Уже сделали.
 
Renat Fatkhullin:
В следующем релизе будет родная поддержка дотнета.

Уже сделали.

А коллбэк когда? Обещали давно.

 
Anton_M:

Суть в том, что мне нужно вызывать функции библиотеки C++/CLI, которая будет обращаться к программе на C# и взаимодействовать с ней.

Падение происходит только если функция на С++ обращается к классам из C# библиотеки. Если их убрать, а оставить только код C++, то советник работает нормально и функция вызывается как надо.

Дык, указатели на классы C# где хранятся между вызовами функций С++ из MQL?

PS Код не смотрел.

ЗЫ2 У меня сокеты сделаны на C++/CLI - все прекрасно работает. Точнее, работало, давно для MQL не использовал.

 
Алексей Барбашин:

Проверять по таймеру или на каждом тике наличия сообщения для МТ - это большой костыль.

Будем надеяться что разработчики этот вопрос решат. Тогда можно будет делать любые расширения для МТ.

Ну, и в самом МТ все тоже самое. Какая разница, что внешняя, что внутренняя? Все по тикам.

 
Renat Fatkhullin:
В следующем релизе будет родная поддержка дотнета.

Уже сделали.

Очень круто, жду релиз! И примерчик dll на C# не забудьте пожалуйста добавить.

 
Alexey Volchanskiy:

Очень круто, жду релиз! И примерчик dll на C# не забудьте пожалуйста добавить.

Ну, без колбеков это игры все. Чуть меньше работы, и только. А если под С++/CLI писать, то вообще без разницы - есть или нет.

 
Yuriy Asaulenko:

Ну, без колбеков это игры все. Чуть меньше работы, и только. А если под С++/CLI писать, то вообще без разницы - есть или нет.

Понятно, что колбеки нужны, но пусть это будет первым шагом. А под С++/CLI писать что-то серьезное, например с WCF, довольно муторно, чисто технически. Я не знаю, как сделать колбеки без полноценных указателей.