在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

posted @ 2021-12-03 09:37  DotNet码农  阅读(765)  评论(0编辑  收藏  举报
/*粒子线条,鼠标移动会以鼠标为中心吸附的特效*/