在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
作者:DotNet码农
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.