기고글 토론 "Linux의 MetaTrader 5" - 페이지 24

 
안녕하세요 여러분!
64비트 우분투 20.04.6 LTS의 와인-8.0.1에서 메타트레이더 5 빌드 3815를 실행 중입니다.
전문가 어드바이저에서 가져온 C# DLL(.NET Framework 4.8)의 함수를 사용합니다. 내보낸 함수가 무엇을 하든 상관없이 전문가를 처음 실행하면 잘 작동하고 두 번째 실행하면 Metatrader 5가 충돌합니다. 메타트레이더 5가 충돌하기 전에 디버거가 전문가에서 중단점에 도달한 적이 없습니다.
전문가 초기화 후 DLL과 관련된 일부 리소스가 해제되지 않는 것 같습니다.
이 문제를 해결할 수 있는 방법이 있나요?

C# DLL 코드:
namespace Test
{
    public static class TestStatic
    {
        public static string TestFunc()
        {
            return "test return value";
        }
    }
}
전문가 어드바이저 코드:
#import "Test.dll"
#import

int OnInit()
  {
   // 이 줄을 사용한 경우 두 번째 실행 충돌
   Print("DLL function result: ", TestStatic::TestFunc());
   
   // 이 줄을 사용하면 두 번째 실행 충돌이 없습니다.
   //Print("사용된 DLL 함수 없음");
   
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason){}
void OnTick() {}

 
WStranger #:
안녕하세요 여러분!
64비트 우분투 20.04.6 LTS의 와인-8.0.1에서 메타트레이더 5 빌드 3815를 실행 중입니다.
전문가 어드바이저에서 가져온 C# DLL(.NET Framework 4.8)의 함수를 사용합니다. 내보낸 함수가 무엇을 하든 상관없이 전문가를 처음 실행하면 잘 작동하고 두 번째 실행하면 Metatrader 5가 충돌합니다. 메타트레이더 5가 충돌하기 전에 디버거가 전문가에서 중단점에 도달하지 않습니다.
전문가 초기화 후 DLL과 관련된 일부 리소스가 해제되지 않는 것 같습니다.
이 문제를 해결할 수 있는 방법이 있나요?

C# DLL 코드:
전문가 어드바이저 코드:

와인 재부팅 창으로 할 수 있을 것 같아요...


 
Dominik Christian Egert #:
와인 재부팅 창으로 할 수 있을 것 같네요...


시도했지만 도움이되지 않았습니다. 터미널 시작 이후 두 번째로 EA를 시작할 때마다 와인 부팅 후에도 크래시가 발생합니다.
 
WStranger #:
시도했지만 도움이 되지 않았습니다. 터미널 시작 이후 두 번째로 EA를 실행할 때마다 와인 부팅 후에도 크러시가 발생합니다.
잘 모르겠지만 윈도우에서도 같은 문제가 있었던 것 같아요....

그러나 나는 그것을 어떻게 해결했는지 기억할 수 없습니다. 아니면 그 문제를 해결했는지....

EA를 어떻게 종료하나요?
 
WStranger #:
안녕하세요 여러분!
64비트 우분투 20.04.6 LTS의 와인-8.0.1에서 메타트레이더 5 빌드 3815를 실행 중입니다.
전문가 어드바이저에서 가져온 C# DLL(.NET Framework 4.8)의 함수를 사용합니다. 내보낸 함수가 무엇을 하든 상관없이 전문가를 처음 실행하면 잘 작동하고 두 번째 실행하면 Metatrader 5가 충돌합니다. 메타트레이더 5가 충돌하기 전에 디버거가 전문가에서 중단점에 도달하지 않습니다.
전문가 초기화 후 DLL과 관련된 일부 리소스가 해제되지 않는 것 같습니다.
이 문제를 해결할 수 있는 방법이 있나요?

C# DLL 코드:
Expert Advisor 코드:

예, 무엇이 문제인지 알고 있습니다.

DLL이 로드 및 언로드 메시지를 제대로 처리하지 못하고 있습니다.

DLL의 올바른 로드 및 언로드를 위해 필요한 최소한의 코드가 누락되어 있습니다.


 

Dominik Christian Egert #:

EA는 어떻게 해지하나요?

차트에서 수동으로 삭제하거나 디버거를 사용하여 중지하는데, 두 경우 모두 결과는 동일합니다.

도미니크 크리스티안 에거트#:

DLL을 올바르게 로드하고 언로드하는 데 필요한 최소한의 코드가 누락되어 있습니다.
이 작업을 제대로 수행하는 방법을 설명하는 사양이나 코드 샘플이 있나요? MQL5 사양에는 그렇지 않다고 나와 있기 때문입니다. 또한 제 경험에 따르면 그렇지 않습니다: 여러 MQL5 프로젝트에서 .NET 라이브러리를 사용하고 있으며 Windows 8.1/10/11에서 예상대로 작동합니다.
 
WStranger #:

차트에서 수동으로 삭제하거나 디버거로 중지했는데 두 경우 모두 결과는 동일합니다.

이 작업을 올바르게 수행하는 방법을 설명하는 사양이나 코드 샘플이 있나요? MQL5 사양에는 그렇지 않다고 나와 있기 때문입니다. 또한 제 경험에 따르면 그렇지 않습니다: 여러 MQL5 프로젝트에서 .NET 라이브러리를 사용하고 있으며 Windows 8.1/10/11에서 예상대로 작동합니다.

편집

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

차트에서 수동으로 삭제하거나 디버거로 중지했는데 두 경우 모두 결과는 동일합니다.

이 작업을 올바르게 수행하는 방법을 설명하는 사양이나 코드 샘플이 있나요? MQL5 사양에는 그렇지 않다고 나와 있기 때문입니다. 또한 제 경험에 따르면 그렇지 않습니다: 여러 MQL5 프로젝트에서 .NET 라이브러리를 사용하고 있으며 Windows 8.1/10/11에서 예상대로 작동합니다.
아마도 DLL이 종료 프로세스에서 분리되지 않는다는 것을 알 수 있습니다.

저는 mysqlclient.dll에서 이 문제로 어려움을 겪고 있었고, 전략 테스터가 DLL을 분리하지 않는다는 것을 알아낼 수 있었습니다. 터미널이 실제로 DLL을 로드하는 것 같고 로드된 상태로 유지되는 경우가 훨씬 더 많습니다.

이전 클라이언트 버전은 현재 작동하지 않기 때문에 더 이상 확인할 수 없으므로 이에 대해 조사해 주시기 바랍니다. 따라서 현재로서는 당시의 문제를 재현할 수 있는 방법이 없습니다.
 
Dominik Christian Egert #:
DLL이 종료 프로세스에서 분리되어 있지 않다는 것을 알 수 있습니다.

저는 mysqlclient.dll과 관련하여 이 문제로 어려움을 겪고 있었는데, 전략 테스터가 DLL을 분리하지 않는다는 사실을 알아낼 수 있었습니다. 오히려 터미널이 실제로 DLL을 로드하고 있는 것처럼 보이며 로드된 상태로 유지됩니다.

이전 클라이언트 버전은 현재 작동하지 않기 때문에 더 이상 확인할 수 없으므로 이에 대해 조사해 주시기 바랍니다. 따라서 현재로서는 당시의 문제를 재현할 수 없습니다.
부끄러운 일입니다. 메타트레이더 5 터미널을 실행하는 Wine 접두사에 .NET Framework가 제대로 설치되지 않았다는 것을 알아냈습니다. 재설치 후 DLL 문제가 해결되었습니다.
어쨌든 도와주셔서 감사합니다!
WineHQ - .NET Framework 4.8
  • appdb.winehq.org
Open Source Software for running Windows applications on other operating systems.
 
WStranger #:
부끄러운 일입니다. 메타트레이더 5 터미널을 실행하는 Wine 접두사에 .NET Framework가 제대로 설치되어 있지 않다는 것을 알아냈습니다. 재설치 후 DLL 문제가 해결되었습니다.
어쨌든 도와주셔서 감사합니다!
다시 알려주셔서 감사합니다.