Советник с DLL на С# вылетает

 

Прошу помочь. Простейший советник (должен складывать два числа) закрывается сразу же при запуске. Решил скомпилировать DLL в C# при помощи UnmanagedExports 1.2.7, и вроде всё шло гладко, но в результате при вызове функции из DLL советник сразу же закрывается.

Вот коды программ:

C#:

using System;

using System.Text;

using RGiesecke.DllExport;

using System.Runtime.InteropServices;



namespace Test2

{

    public class Test2

    {

        [DllExport("Add", CallingConvention = CallingConvention.StdCall)]

        public static int Add(int left, int right)

        {

            return left + right;

        }

    }

}

MQL4:

#property copyright "Author"
#property link      ""
#property version   "1.00"
#property strict

#import "Test2.dll"
   int Add(int left,int right);
#import

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    Comment(Add(2,3));
    return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   
  }
void start()
  {
   
  }
 
Максим Пругло:

Прошу помочь. Простейший советник (должен складывать два числа) закрывается сразу же при запуске. Решил скомпилировать DLL в C# при помощи UnmanagedExports 1.2.7, и вроде всё шло гладко, но в результате при вызове функции из DLL советник сразу же закрывается.

Вот коды программ:

C#:

MQL4:

this

:-)

в 4-ке так не работает...так только в 5-й

 
Maxim Kuznetsov:

this

:-)

в 4-ке так не работает...так только в 5-й

работает

в 5-ке как раз этот пример и не будет работать, там сейчас вообще не нужно ничего экспортировать - все публичные статик методы автоматом видны в MQL5

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

Прошу помочь. Простейший советник (должен складывать два числа) закрывается сразу же при запуске. Решил скомпилировать DLL в C# при помощи UnmanagedExports 1.2.7, и вроде всё шло гладко, но в результате при вызове функции из DLL советник сразу же закрывается.

Вот коды программ:

C#:

MQL4:

используйте статью https://www.mql5.com/ru/articles/249

все примеры с использованием шаблона Robert Giesecke Unmanaged exports работают в MQL4  на 100% - я проверял

единственное - у меня не работал экспорт с помощью шаблона  Robert Giesecke  в русскоязычных Windows , я установил на виртуалку англ. Win7 - и все работает без проблем, т.е. проект писал и компилировал на виртуалке, а готовую .dll копировал и использовал в обычных терминалах MT4

 
Серьёзно?? Я-то на русскоязычной сижу. Может поэтому и не пашет. Неужто только виртуалку ставить... Я ведь и взял код с той страницы, на которую Вы указываете, по ней изучал, как всё сделать.
 

Кстати, а что именно надо выбирать для проекта в Visual Studio под шаблон Robert Giesecke?

Там просто есть слишком много вариантов:

"Классическое приложение Windows --> Библиотека классов (.NET Framework)"

"Классическое приложение Windows --> Библиотека элементов управления Windows Forms (.NET Framework)"

".NET Core --> Библиотека классов (.NET Core)"

".NET Standart --> Библиотека классов (.NET Standart)"

 
В общем потратил кучу времени, установил виртуальную машину, на неё - винду семёрку англоязычную, дальше - новый Визуал 2019 накатил, скомпилировал DLL вот с такими результатами, как на прикреплённом скриншоте, а общий итог... ничего не сдвинулось с места(( советник просто вылетает на вызове функции.. я почти в отчаянии
Виртуальный хостинг для MetaTrader 5
Виртуальный хостинг для MetaTrader 5
  • www.mql5.com
Самый быстрый виртуальный выделенный сервер (VPS) для трейдинга на форексе от производителей терминала MetaTrader 4/5
Файлы:
 
Максим Пругло:
В общем потратил кучу времени, установил виртуальную машину, на неё - винду семёрку англоязычную, дальше - новый Визуал 2019 накатил, скомпилировал DLL вот с такими результатами, как на прикреплённом скриншоте, а общий итог... ничего не сдвинулось с места(( советник просто вылетает на вызове функции.. я почти в отчаянии

ещё раз по буквам - Т О Л Ь К О   Д Л Я    M T 5

---

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

 
ну вроде ж вон у товарища получилось..... была надежда...
 
Специально качнул и установил МТ5 - и прямо сразу в таком виде как есть запустилось и отработало как надо.. мда..
 
тогда вопрос: а иначе как-то можно DLL для МТ4 использовать?
 

грабли...вилы... колхоз... 

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


вот запустил на виртуалке, создал новый проект по шаблону Robert Giesecke, все работает

код C#:

using System;
using System.Data;
using System.Text;
using System.Runtime.InteropServices;
using RGiesecke.DllExport;

namespace tst
{

    public static class testclass
    {
        [DllExport("add", CallingConvention = CallingConvention.StdCall)]
        public static int add(int a, int b)
        {
            return a + b;
        }

        [DllExport("mul", CallingConvention = CallingConvention.StdCall)]
        public static int mul(int a, int b)
        {
            return a * b;
        }
    }
}

код скрипта MQL4:

#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#import "tst.dll"
int add(int, int);
int mul(int, int);
#import
//+------------------------------------------------------------------+
void OnStart()
{
   Print("add = ", add(2, 3));
   Print("mul = ", mul(2, 3));
}
//+------------------------------------------------------------------+

результат (лог):

2021.03.05 21:10:13.297 Script tst EURUSD,H1: removed

2021.03.05 21:10:13.295 tst EURUSD,H1: uninit reason 0

2021.03.05 21:10:13.295 tst EURUSD,H1: mul = 6

2021.03.05 21:10:13.295 tst EURUSD,H1: add = 5

2021.03.05 21:10:13.295 tst EURUSD,H1: initialized

2021.03.05 21:10:13.287 Script tst EURUSD,H1: loaded successfully


проект под VS приатачил, в нем в папке Debug лежит tst.dll чтобы проверить скрипт, дальше модифицируйте проект VS и компилируйте, если "не взлетел" на МТ4, однозначно проблема на Вашей стороне

удачи!

Файлы:
test.zip  908 kb