Обсуждение статьи "MetaTrader 5 на Linux" - страница 24

 
Привет всем!
У меня работает Metatrader 5 build 3815 на wine-8.0.1 в 64-битной Ubuntu 20.04.6 LTS.
В своем эксперте я использую функцию из импортированной C# DLL (.NET Framework 4.8). Независимо от того, что делает экспортированная функция, при первом запуске эксперт работает нормально, а на второй раз Metatrader 5 просто падает. Отладчик никогда не попадал в точки останова в Эксперте до того, как Metatrader 5 падал.
Похоже, что некоторые ресурсы, связанные с DLL, не освобождаются после деинициализации Expert.
Есть ли способ это исправить?

Код DLL на C#:
namespace Test
{
    public static class TestStatic
    {
        public static string TestFunc()
        {
            return "test return value";
        }
    }
}
Код эксперта:
#import "Test.dll"
#import

int OnInit()
  {
   // 2-й запуск аварийно завершается, если используется эта строка
   Print("DLL function result: ", TestStatic::TestFunc());
   
   // при использовании этой строки не произойдет сбоя во втором запуске
   //Print("не использовались функции DLL");
   
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason){}
void OnTick() {}

 
WStranger #:
Привет всем!
У меня работает Metatrader 5 build 3815 на wine-8.0.1 в 64-битной Ubuntu 20.04.6 LTS.
В своем эксперте я использую функцию из импортированной C# DLL (.NET Framework 4.8). Независимо от того, что делает экспортированная функция, при первом запуске эксперт работает нормально, а на второй раз Metatrader 5 просто падает. Отладчик никогда не попадает в точки останова в Эксперте до того, как Metatrader 5 падает.
Похоже, что некоторые ресурсы, связанные с DLL, не освобождаются после деинициализации Expert.
Есть ли способ это исправить?

Код DLL на C#:
Код эксперта:

Думаю, перезагрузка windows с помощью wine поможет...


 
Dominik Christian Egert #:
Думаю, виндовая перезагрузка windows поможет...


Пробовал, не помогло. Каждый второй запуск EA с момента запуска терминала приводит к крашу, даже после wineboot
 
WStranger #:
Пробовал, не помогло. Каждый второй запуск EA с момента запуска терминала приводит к сбою, даже после wineboot
Я не уверен, но мне кажется, что у меня была такая же проблема на windows, как и well.....

Но я не могу вспомнить, как я ее решил. Да и решил ли я ее, если на то пошло....

Как вы завершаете работу советника?
 
WStranger #:
Привет всем!
У меня работает Metatrader 5 build 3815 на wine-8.0.1 в 64-битной Ubuntu 20.04.6 LTS.
В своем эксперте я использую функцию из импортированной C# DLL (.NET Framework 4.8). Независимо от того, что делает экспортированная функция, при первом запуске эксперт работает нормально, а на второй раз Metatrader 5 просто падает. Отладчик никогда не попадает в точки останова в Эксперте до того, как Metatrader 5 падает.
Похоже, что некоторые ресурсы, связанные с DLL, не освобождаются после деинициализации Expert.
Есть ли способ это исправить?

Код DLL на C#:
Код эксперта:

Да, я знаю, в чем проблема.

Ваша DLL не обрабатывает сообщения о загрузке и выгрузке должным образом.

Вам не хватает минимально необходимого кода для правильной загрузки и выгрузки DLL.


 

Dominik Christian Egert #:

Как завершить работу советника?

Я удаляю его вручную с графика или останавливаю с помощью отладчика - результат в обоих случаях один и тот же.

Доминик Кристиан Эгерт#:

Вам не хватает минимально необходимого кода для правильной загрузки и выгрузки DLL.
Есть ли у вас спецификации или примеры кода, объясняющие, как это правильно делать? Потому что спецификация MQL5 говорит об обратном. Также мой опыт говорит об обратном: Я использую библиотеки .NET в нескольких MQL5-проектах, и они работают так, как ожидалось в Windows 8.1/10/11.
 
WStranger #:

Я удаляю его вручную с графика или останавливаю с помощью отладчика - результат в обоих случаях один и тот же.

Есть ли у вас спецификации или примеры кода, объясняющие, как правильно это сделать? Потому что спецификация MQL5 говорит об обратном. Да и мой опыт говорит об обратном: Я использую .NET библиотеки в нескольких MQL5 проектах и все работает как надо в Windows 8.1/10/11.

EDIT:

https:// learn.microsoft.com/en-us/windows/win32/dlls/dllmain
 
WStranger #:

Я удаляю его вручную с графика или останавливаю с помощью отладчика - результат в обоих случаях один и тот же.

Есть ли у вас спецификации или примеры кода, объясняющие, как правильно это сделать? Потому что спецификация MQL5 говорит об обратном. Да и мой опыт говорит об обратном: Я использую библиотеки .NET в нескольких MQL5-проектах, и они работают, как и ожидалось, в Windows 8.1/10/11.
Скорее всего, вы обнаружите, что DLL не отделяется от завершающегося процесса.

Я боролся с этой проблемой с mysqlclient.dll и смог выяснить, что тестер стратегий не отсоединяет DLL. Гораздо больше похоже, что Terminal действительно загружает DLL, и она остается загруженной.

Пожалуйста, проведите исследование, потому что я больше не могу подтвердить старые версии клиента, так как они не работают на сегодняшний день. Поэтому в настоящее время у меня нет возможности воспроизвести проблему с тех пор.
 
Dominik Christian Egert #:
Скорее всего, вы обнаружите, что DLL не отделяется от завершающегося процесса.

Я боролся с этой проблемой с mysqlclient.dll и смог выяснить, что тестер стратегий не отсоединяет DLL. Гораздо больше похоже на то, что терминал на самом деле загружает DLL, и именно там она и остается.

Пожалуйста, проведите исследование, потому что я больше не могу подтвердить старые версии клиента, так как они не работают на сегодняшний день. Поэтому в настоящее время у меня нет возможности воспроизвести проблему с тех пор.
Мне стыдно. Я выяснил, что .NET Framework был неправильно установлен на префиксе Wine, где я запускаю терминал Metatrader 5. После его переустановки проблема с DLL была решена.
В любом случае спасибо за помощь!
WineHQ - .NET Framework 4.8
  • appdb.winehq.org
Open Source Software for running Windows applications on other operating systems.
 
WStranger #:
К моему стыду. Я выяснил, что .NET Framework был неправильно установлен на префиксе Wine, где я запускаю терминал Metatrader 5. После его переустановки проблема с DLL была решена.
В любом случае спасибо за помощь!
Спасибо, что сообщили, я этого не знал.