You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从MQL4向C# DLL传递数据?请求提供最小实现示例

嘿,我之前正好折腾过MQL4和C# DLL的字符串传递,思路确实和C++类似,但要注意CLR和原生代码交互的几个细节,下面给你一个最小可运行的完整示例,分C#端和MQL4端两部分:

C# DLL 实现步骤

首先你需要创建一个C#类库项目,然后做以下操作:

  1. 安装UnmanagedExports NuGet包(这是实现C#函数导出给非托管代码调用的关键工具),在Package Manager Console里执行:
Install-Package UnmanagedExports
  1. 编写核心代码,处理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);
        }
    }
}
  1. 编译设置:必须把项目编译为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:29:50