Discussão do artigo "MetaTrader 5 no Linux" - página 24

 
Olá a todos!
Estou executando o Metatrader 5 build 3815 no wine-8.0.1 no Ubuntu 20.04.6 LTS de 64 bits.
Em meu Expert Advisor, uso uma função da DLL C# importada (NET Framework 4.8). Independentemente do que a função exportada faz, o Expert funciona bem na primeira vez que o lanço e, na segunda vez, o Metatrader 5 simplesmente trava. O depurador nunca atinge os pontos de interrupção no Expert antes de o Metatrader 5 travar.
Parece que alguns recursos relacionados à DLL não estão sendo liberados após a desinicialização do Expert.
Há alguma maneira de corrigir isso?

Código da DLL em C#:
namespace Test
{
    public static class TestStatic
    {
        public static string TestFunc()
        {
            return "test return value";
        }
    }
}
Código do Expert Advisor:
#import "Test.dll"
#import

int OnInit()
  {
   // falha na segunda execução se essa linha for usada
   Print("DLL function result: ", TestStatic::TestFunc());
   
   // não haverá falha na segunda execução se essa linha for usada
   //Print("nenhuma função DLL usada");
   
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason){}
void OnTick() {}

 
WStranger #:
Olá a todos!
Estou executando o Metatrader 5 build 3815 no wine-8.0.1 no Ubuntu 20.04.6 LTS de 64 bits.
Em meu Expert Advisor, uso uma função da DLL C# importada (NET Framework 4.8). Independentemente do que a função exportada faz, o Expert funciona bem na primeira vez que eu o lanço e, na segunda vez, o Metatrader 5 simplesmente trava. O depurador nunca atinge os pontos de interrupção no Expert antes de o Metatrader 5 travar.
Parece que alguns recursos relacionados à DLL não estão sendo liberados após a desinicialização do Expert.
Há alguma maneira de corrigir isso?

Código da DLL em C#:
Código do Expert Advisor:

Acho que uma reinicialização do Windows com o Wine resolverá o problema...


 
Dominik Christian Egert #:
Acho que uma reinicialização do Windows com o Wine resolverá o problema...


Tentei, mas não adiantou. Cada segundo lançamento do EA desde a inicialização do terminal resulta em uma falha, mesmo após a reinicialização do Wine
 
WStranger #:
Tentei, mas não adiantou. Cada segundo lançamento do EA desde a inicialização do terminal resulta em um travamento, mesmo após a inicialização do vinho
Não tenho certeza, mas acho que tive o mesmo problema no Windows também....

Mas não me lembro como resolvi o problema. Ou se resolvi o problema....

Como você encerra o EA?
 
WStranger #:
Olá a todos!
Estou executando o Metatrader 5 build 3815 no wine-8.0.1 no Ubuntu 20.04.6 LTS de 64 bits.
Em meu Expert Advisor, uso uma função da DLL C# importada (NET Framework 4.8). Independentemente do que a função exportada faz, o Expert funciona bem na primeira vez que eu o lanço e, na segunda vez, o Metatrader 5 simplesmente trava. O depurador nunca atinge os pontos de interrupção no Expert antes de o Metatrader 5 travar.
Parece que alguns recursos relacionados à DLL não estão sendo liberados após a desinicialização do Expert.
Há alguma maneira de corrigir isso?

Código da DLL C#:
Código do Expert Advisor:

Sim, eu sei qual é o problema.

Sua DLL não está lidando corretamente com as mensagens de carga e descarga.

Está faltando o código mínimo necessário para carregar e descarregar corretamente as DLLs.


 

Dominik Christian Egert #:

Como você encerra o EA?

Eu o excluo manualmente de um gráfico ou o interrompo com o depurador - o resultado é o mesmo em ambos os casos.

Dominik Christian Egert#:

Está faltando o código mínimo necessário para carregar e descarregar corretamente as DLLs.
Você tem alguma especificação ou exemplo de código que explique como fazer isso corretamente? Porque a especificação MQL5 diz o contrário. Minha experiência também diz o contrário: Estou usando bibliotecas .NET em vários projetos MQL5 e elas funcionam como esperado no Windows 8.1/10/11.
 
WStranger #:

Eu o excluo manualmente de um gráfico ou o interrompo com o depurador - o resultado é o mesmo em ambos os casos.

Você tem alguma especificação ou exemplo de código que explique como fazer isso corretamente? Porque as especificações da MQL5 dizem o contrário. Minha experiência também diz o contrário: Estou usando bibliotecas .NET em vários projetos MQL5 e elas funcionam como esperado no Windows 8.1/10/11.

EDITAR:

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

Eu o excluo manualmente de um gráfico ou o interrompo com o depurador - o resultado é o mesmo em ambos os casos.

Você tem alguma especificação ou exemplo de código que explique como fazer isso corretamente? Porque as especificações da MQL5 dizem o contrário. Minha experiência também diz o contrário: Estou usando bibliotecas .NET em vários projetos MQL5 e elas funcionam como esperado no Windows 8.1/10/11.
O que você provavelmente descobrirá é que a DLL não é separada do processo de encerramento.

Eu estava lutando com esse problema com o mysqlclient.dll e consegui descobrir que o testador de estratégia não separa a DLL de forma limpa. Parece muito mais que o Terminal está realmente carregando a DLL e é aí que ela permanece carregada.

Faça uma pesquisa sobre isso, pois não posso mais confirmar as versões mais antigas do cliente, já que elas não funcionam até o momento. Portanto, no momento não tenho a possibilidade de reproduzir o problema daquela época.
 
Dominik Christian Egert #:
O que você provavelmente descobrirá é que a DLL não está separada do processo de encerramento.

Eu estava lutando com esse problema com o mysqlclient.dll e consegui descobrir que o testador de estratégia não separa a DLL de forma limpa. Parece muito mais que o Terminal está realmente carregando a DLL e é aí que ela permanece carregada.

Faça uma pesquisa sobre isso, pois não posso mais confirmar as versões mais antigas do cliente, já que elas não funcionam até o momento. Portanto, atualmente não tenho a possibilidade de reproduzir o problema daquela época.
Que vergonha. Descobri que o .NET Framework não estava instalado corretamente no prefixo do Wine onde executo o terminal do Metatrader 5. Depois de reinstalá-lo, o problema da DLL foi resolvido.
De qualquer forma, obrigado por sua ajuda!
WineHQ - .NET Framework 4.8
  • appdb.winehq.org
Open Source Software for running Windows applications on other operating systems.
 
WStranger #:
Que vergonha. Descobri que o .NET Framework não estava instalado corretamente no prefixo do Wine onde executo o terminal do Metatrader 5. Depois de reinstalá-lo, o problema da DLL foi resolvido.
De qualquer forma, obrigado por sua ajuda!
Bem, obrigado por informar, eu não sabia disso.