如何从MQL4向C# DLL传递数据?请求提供最小实现示例
嘿,我之前正好折腾过MQL4和C# DLL的字符串传递,思路确实和C++类似,但要注意CLR和原生代码交互的几个细节,下面给你一个最小可运行的完整示例,分C#端和MQL4端两部分:
C# DLL 实现步骤
首先你需要创建一个C#类库项目,然后做以下操作:
- 安装
UnmanagedExportsNuGet包(这是实现C#函数导出给非托管代码调用的关键工具),在Package Manager Console里执行:
Install-Package UnmanagedExports
- 编写核心代码,处理MQL4传来的字符串:
using System; using System.Runtime.InteropServices; using RGiesecke.DllExport; namespace Mql4StringHandler { public class StringProcessor { // 导出给MQL4调用的函数,调用约定必须和MQL4一致(StdCall) [DllExport("ProcessMqlString", CallingConvention = CallingConvention.StdCall)] public static void ProcessMqlString(IntPtr strPtr) { // MQL4的字符串是ANSI编码的原生指针,转成C#字符串 string receivedStr = Marshal.PtrToStringAnsi(strPtr); // 这里写你的业务逻辑,比如打印、解析等等 Console.WriteLine($"从MQL4收到字符串: {receivedStr}"); } // 可选:如果需要从C#返回字符串给MQL4的示例函数 [DllExport("GetReplyFromCSharp", CallingConvention = CallingConvention.StdCall)] public static IntPtr GetReplyFromCSharp() { string reply = "这是来自C# DLL的回复!"; // 把C#字符串转成ANSI编码的非托管内存指针,MQL4需要负责释放这块内存 return Marshal.StringToHGlobalAnsi(reply); } } }
- 编译设置:必须把项目编译为x86(32位),因为MQL4是32位程序,64位DLL无法被调用。
MQL4 调用代码
编写一个MQL4脚本或者EA,导入C# DLL并调用:
// 导入C# DLL的函数 #import "Mql4StringHandler.dll" void ProcessMqlString(string inputStr); string GetReplyFromCSharp(); #import // 导入系统函数用于释放C#分配的内存 #import "kernel32.dll" int GlobalFree(int memPtr); #import void OnStart() { // 1. 向C# DLL传递字符串 string mqlMessage = "你好,C# DLL!我来自MQL4"; ProcessMqlString(mqlMessage); // 2. 从C# DLL获取返回的字符串 string csharpReply = GetReplyFromCSharp(); Print("收到C#的回复: ", csharpReply); // 重点:释放C#分配的非托管内存,避免泄漏 GlobalFree((int)csharpReply); }
关键注意事项
- 平台一致性:一定要确保C# DLL是32位编译,MQL4不支持64位DLL调用,这是最容易踩的坑。
- 编码匹配:MQL4默认使用ANSI编码,所以C#里必须用
Marshal.PtrToStringAnsi和Marshal.StringToHGlobalAnsi,用Unicode的话会出现乱码。 - 内存管理:如果C#返回字符串给MQL4,C#分配的非托管内存必须由MQL4手动释放(用
GlobalFree),否则会造成内存泄漏。 - 调用约定:必须使用
StdCall,这是MQL4默认的函数调用约定,不匹配会导致栈溢出或者调用失败。
内容的提问来源于stack exchange,提问作者Iason
相关产品推荐
相关产品推荐

