記事"Linux 上での MetaTrader 5"についてのディスカッション - ページ 24

 
皆さんこんにちは!
私はメタトレーダー5ビルド3815をwine-8.0.1上で64ビットUbuntu 20.04.6 LTSで動かしています。
私のExpert Advisorでは、インポートしたC# DLL(.NET Framework 4.8)の関数を使用しています。エクスポートした関数が何をするかは関係なく、Expertは最初に起動したときはうまく動作しますが、2回目に起動したときはメタトレーダー5がクラッシュします。メタトレーダー 5 がクラッシュする前に、デバッガーが Expert のブレークポイントをヒットすることはありません。
Expert の非初期化後に DLL に関連するリソースが解放されていないようです。
これを修正する方法はありますか?

C# DLL コード:
namespace Test
{
    public static class TestStatic
    {
        public static string TestFunc()
        {
            return "test return value";
        }
    }
}
Expert Advisor コード:
#import "Test.dll"
#import

int OnInit()
  {
   // この行が使用された場合、2回目の実行でクラッシュする
   Print("DLL function result: ", TestStatic::TestFunc());
   
   // この行が使用されていれば、2回目の実行でクラッシュすることはない
   //Print("no DLL functions used");
   
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason){}
void OnTick() {}

 
WStranger #:
皆さん、こんにちは!
私はメタトレーダー5 ビルド3815を64ビットのUbuntu 20.04.6 LTSのwine-8.0.1で動かしています。
私のExpert Advisorでは、インポートしたC# DLL(.NET Framework 4.8)の関数を使用しています。エクスポートした関数が何をするかは関係なく、Expertは最初に起動したときはうまく動作しますが、2回目に起動したときはメタトレーダー5がクラッシュします。Metatrader 5 がクラッシュする前に、デバッガが Expert のブレークポイントをヒットすることはありません。
Expert の非初期化後、DLL に関連するいくつかのリソースが解放されていないようです。
これを修正する方法はありますか?

C# DLL コード:
Expert Advisor コード:

ワインで再起動すれば直ると思いますが...。


 
Dominik Christian Egert #:
ワインでウインドウズを再起動すればいいんだろうけど...。


試してみたが、解決しなかった。ターミナルを起動してから2回EAを起動するたびに、winebootの後でもクラッシュする。
 
WStranger #:
試してみたが、解決しなかった。ターミナルを起動してから2回EAを起動するたびに、wineboot後でもクラッシュする。
確かではありませんが、ウィンドウズでも同じ問題があったような...。

でも、どうやって解決したのか覚えていません。解決したかどうかも覚えていません。

どうやってEAを終了させるのですか?
 
WStranger #:
皆さん、こんにちは!
私はMetatrader 5 build 3815をwine-8.0.1、64-bit Ubuntu 20.04.6 LTSで動かしています。
私のExpert Advisorでは、インポートしたC# DLL(.NET Framework 4.8)の関数を使用しています。エクスポートされた関数が何をするかに関係なく、Expertは最初に起動したときはうまく動作しますが、2回目に起動したときはメタトレーダー5がクラッシュします。Metatrader 5 がクラッシュする前に、デバッガが Expert のブレークポイントをヒットすることはありません。
Expert の非初期化後、DLL に関連するいくつかのリソースが解放されていないようです。
これを修正する方法はありますか?

C# DLL コード:
Expert Advisor コード:

はい、問題はわかっています。

あなたの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でこの問題と格闘していましたが、strategy testerはDLLをきれいに切り離さないことがわかりました。それよりも、ターミナルが実際にDLLをロードしているようで、そこでロードされたままになっています。

古いバージョンのクライアントは今日現在動作していないので、確認できません。そのため、当時の問題を再現できる可能性は今のところありません。
 
Dominik Christian Egert #:
おそらく、DLLが終了プロセスから切り離されていないことがわかるだろう。

私はmysqlclient.dllでこの問題と格闘していたが、strategy testerは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の問題は解決しました。
とにかくご苦労様でした!
ご報告ありがとうございます。