文章 "Linux 上的 MetaTrader 5" - 页 24

 
大家好!
我在 64 位 Ubuntu 20.04.6 LTS 的 wine-8.0.1 上运行 Metatrader 5 build 3815。
在我的 "专家顾问 "中,我使用了一个从导入的 C# DLL(.NET Framework 4.8)中导出的函数。不管导出的函数是做什么的,专家顾问在我第一次启动时运行良好,而第二次启动时 Metatrader 5 就崩溃了。在 Metatrader 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("no DLL functions used");
   
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason){}
void OnTick() {}

 
WStranger #:
大家好
我在 64 位 Ubuntu 20.04.6 LTS 的 wine-8.0.1 上运行 Metatrader 5 build 3815。
在我的 "专家顾问 "中,我使用了一个从导入的 C# DLL(.NET Framework 4.8)中导出的函数。不管导出的函数是做什么用的,专家顾问在我第一次启动时运行良好,而第二次启动时 Metatrader 5 就崩溃了。在 Metatrader 5 崩溃之前,调试器从未在专家程序中遇到断点。
看来在专家程序去初始化后,一些与 DLL 相关的资源没有被释放。
有办法解决这个问题吗?

C# DLL 代码:
专家顾问代码:

我猜用红酒重启 Windows 就可以了...


 
Dominik Christian Egert #:
我想用葡萄酒重启 Windows 就可以了......


试过了,没用。自终端启动后,每启动一次 EA 都会导致崩溃,甚至在重启 wine 后也是如此
 
WStranger #:
试过了,没用。自终端启动以来,每启动一次 EA 都会导致崩溃,即使是在重启后也是如此。
我不确定,但我想我在 Windows 上也遇到过同样的问题,....。

但我不记得我是怎么解决的了。或者我是否解决了这个问题....。

如何终止 EA?
 
WStranger #:
大家好
我在 64 位 Ubuntu 20.04.6 LTS 中的 wine-8.0.1 上运行 Metatrader 5 build 3815。
在我的 "专家顾问 "中,我使用了一个从导入的 C# DLL(.NET Framework 4.8)中导出的函数。不管导出的函数是做什么用的,专家顾问在我第一次启动时运行良好,而第二次启动时 Metatrader 5 就崩溃了。在 Metatrader 5 崩溃之前,调试器从未在专家程序中遇到断点。
看来在专家程序去初始化后,一些与 DLL 相关的资源没有被释放。
有办法解决这个问题吗?

C# DLL 代码:
专家顾问代码:

是的,我知道问题所在。

您的 DLL 没有正确处理加载和卸载信息。

您缺少正确加载和卸载 DLL 所需的最基本代码。


 

Dominik Christian Egert #:

如何终止 EA?

我从图表中手动删除或用调试器停止,结果都一样。

Dominik Christian Egert#

您缺少正确加载和卸载 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 时遇到过这个问题,后来发现 strategy tester 并没有将 DLL 干净地分离出来。更多的情况是,Terminal 实际上在加载 DLL,而且一直加载在那里。

请对此进行一些研究,因为我无法再确认旧版本的客户端,因为它们目前已无法使用。因此,我目前无法重现当时的问题。
我真无耻。我发现在运行 Metatrader 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 #:
我真无耻。我发现在运行 Metatrader 5 终端的 Wine 前缀上没有正确安装 .NET Framework。重新安装后,DLL 问题就解决了。
无论如何,感谢您的帮助!
谢谢您的反馈,我并不知道。