在MT4或MT5調用C#/VB.NET dll

 

以上是在MT4或MT5中調用C# DLL的一些總結:

================================================

在mql4/mql5 調用 dll,有以下的情況。

 
1. 直接調用系統 dll,如果熟悉 win32 api 直接調用系統 dll 就可以達成許多功能,這樣就不需要另外再寫外部的 dll。
 
2. 外部 dll,儘量用 C 來寫,畢竟 MT4/MT5 是用 C/C++ 寫,調用外部 C 寫的 dll,MetaQuotes 官網也提供教程範本代碼。
 
3. 如果真的要用 C# 來寫,需要先考慮的是,C# 編譯後的執行檔或 dll 相當容易被 decompile,保護力遠低於 ex4 ex5,原本要把特殊功能放在外部 dll 結果是更容易被破解。
 
 
但如果要達成的是一個複雜的功能,例如使用 CefSharp 這樣複雜的 embed chrome 生成一個複雜的界面窗口,那靠 C# 來寫一個 dll 也就只能這樣作了。
 
 
下面記述如何生成一個可以被 MT4/MT5 直接調用的 C# dll,關鍵就是 C# 原生的 dll 是 managed codes, 需要轉成 MT4/MT5 可以調用的 unmanaged export 的接口 (注: 新版的 MT5 看 release note 是可以直接調用 C# dll,但 MT4 是確定沒有辦法直接調用原生的 C# dll)
 
 
 步驟如下:
-----------------------------------------------------------------------------------
①用 Visual Studio 建立一個 C# dll project (Class Library)

 

 ②輸出改爲 x86,因 MT4 是 x86 版,用 default 的 any cpu 會有問題

 

③ 在 Nuget package 選擇添加下面這個 package:UnmanagedExports.Repack.Upgrade

     

 

 

  ④ C# 的範例如下(簡單的對參數作 square 和 square root)

using System;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;

namespace MathDll
{
    class MathDll
    {
       [DllExport("Square", CallingConvention = CallingConvention.StdCall)]
       public static double Square(double a)
       {
           return a * a;
       }

       [DllExport("SquareRoot", CallingConvention = CallingConvention.StdCall)]
       public static double SquareRoot(double a)
       {
           return Math.Sqrt(a);
       }
    }
}

⑤ 把生成的 dll 放在 /mql4/libraries/ 文件夾內,在 mql4 開發端的調用代碼如下:

#import "MathDll.dll"
double Square(double);
double SquareRoot(double);
#import
//+------------------------------------------------------------------+
//| Expert initialization function                             |
//+------------------------------------------------------------------+
int OnInit()
  {
   double a=9;
   Print("Square ",a," = ",Square(a));
   Print("SquareRoot ",a," = ",SquareRoot(a));
  return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                           |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                      |
//+------------------------------------------------------------------+
void OnTick()
  {
  }

⑥輸出結果在日誌如下:

 

 

 到此結束,end

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章