• 在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

    如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的推荐将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

    作者博客: http://www.cnblogs.com/yuwentao/
    联系QQ:511972961    点击这里给我发消息
    E-mail:511972961@qq.com
  • 相关阅读:
    微信小程序开发入门(十六)
    npm安装教程
    js 比较两个日期大小
    js截取手机号后四位,并倒序输出
    TypeScript的安装和编译
    js中null和" "的区别
    阻止事件冒泡的3种方法
    阻止事件冒泡
    chrome查看js报错Uncaught SyntaxError: Unexpected string
    ES6思维导图
  • 原文地址:https://www.cnblogs.com/yuwentao/p/15633473.html
Copyright © 2020-2023  润新知