将 C# DLL 导入 MQL5 的噩梦
The nightmare of importing C# DLL to MQL5
大家好,我有点问题,我主要在 python 中编程,而且实际上已经有一段时间了,因为我用 C# 编码,我时不时地用 mql 编码。我的问题是我构建了一个具有几个简单函数的 C# dll 文件:
[DllExport("debugger", CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.LPWStr)]
public static string debugger()
{
return "Send help!! SOS";
}
[DllExport("debugger2", CallingConvention = CallingConvention.StdCall)]
public static int debugger2()
{
return 12345;
}
这是我的 C# 文件中的简单代码,它都在 public 静态 class 中,解决方案平台是 x64。代码编译得很好,我没有发现任何问题。现在这是我的 MetaEditor 代码的样子:
#import "simpleFunctions.dll"
string debugger();
int debugger2();
#import
int OnInit()
{
//Print a statement just to show where code crashes
Print("We are definitly in it :D");
Print(debugger);
}
根据 Journal 告诉我的一切运行良好,文件是从库中添加的,并且 OnInit 函数开头的打印语句也运行。从我的 dll 文件调用第一个调试器函数时出现问题,就在我在日志中的 Print 语句下方,我收到以下错误:
- Cannot find 'debugger', in 'simpleFunctions.dll'
- unresolved import function call
- OnInit critical error
- tester stopped because OnInit failed
我不满地搜索了整个互联网,发现没有人真正以实用的方式回答这个问题。我怀疑错误可能在于数据类型差异方面的 C# 方面,但我真的不知道从哪里继续查看这一点。任何帮助将不胜感激。
好吧,在可能在每个网站上搜索与我的问题相关的答案之后,切换回 python 并尝试使用不同的方式连接到 mql5(使用套接字),而不是最终尝试 C++ 并花费最后两个时间几天学习,我想我终于解决了我的问题。仅发布此内容以帮助将来可能遇到类似问题的任何人。我认为由于 MQL5 更像是 C++ 而不是 C#,因此链接过程会更容易一些。它自身的代码一点也不复杂,因为我只是想从 C++ 获取 MQL5 中的函数 运行。
#include "pch.h"
#include "CPPMQLSQLConnector.h"
#define CPPMQLSQLCONNECTOR_API
#include <string>
std::string __stdcall myString(std::string Words)
{
static std::string myWords = "This is about to work I can feel it. ";
return myWords + Words;
}
int __stdcall myInt(int numbr)
{
static int myNumber = 1998;
numbr = 22;
return myNumber + numbr;
}
注意方法指针前的 __stdcall,需要调用约定让 MQL5 知道如何从库中获取函数。
在我的 C++ 头文件中,我让 C++ 知道我想使用“__declspec(dllexport)”和“__declspec(dllimport)”导出哪些函数,这是我对这个问题的看法价值与您为它付出的一样多,但我的理解是 export 关键字让 C++ 知道我想要导出哪些函数,而 import 关键字由 MQL5 或任何应用程序使用,以了解要导入哪些函数。我的头文件
#pragma once
#include <string>
#ifndef MYDLL
#define MYDLL
#ifdef CPPMQLSQLCONNECTOR_API
extern "C" __declspec(dllexport) std::string __stdcall myString(std::string Words);
extern "C" __declspec(dllexport) int __stdcall myInt(int numbr);
#else
extern "C" __declspec(dllimport) std::string __stdcall myString(std::string Words);
extern "C" __declspec(dllimport) int __stdcall myInt(int numbr);
#endif
#endif
我们使用 extern "C" 关键字让编译器知道它应该期待 'C' 代码。
最后是MQL5代码,非常简单。我们只需导入 dll 并开始使用这些函数来实现它们的目的
#import "CPPMQLSQLConnector.dll"
string myString(string s);
int myInt(int i);
#import
int OnInit()
{
string Word = "Momma I made it!!!!!!!!!!!!";
int numbr = 25;
Print("We definitely init ;D");
Print("La string: ", myString(Word));
Print("La integer: ", myInt(numbr));
return(INIT_SUCCEEDED);
}
大家好,我有点问题,我主要在 python 中编程,而且实际上已经有一段时间了,因为我用 C# 编码,我时不时地用 mql 编码。我的问题是我构建了一个具有几个简单函数的 C# dll 文件:
[DllExport("debugger", CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.LPWStr)]
public static string debugger()
{
return "Send help!! SOS";
}
[DllExport("debugger2", CallingConvention = CallingConvention.StdCall)]
public static int debugger2()
{
return 12345;
}
这是我的 C# 文件中的简单代码,它都在 public 静态 class 中,解决方案平台是 x64。代码编译得很好,我没有发现任何问题。现在这是我的 MetaEditor 代码的样子:
#import "simpleFunctions.dll"
string debugger();
int debugger2();
#import
int OnInit()
{
//Print a statement just to show where code crashes
Print("We are definitly in it :D");
Print(debugger);
}
根据 Journal 告诉我的一切运行良好,文件是从库中添加的,并且 OnInit 函数开头的打印语句也运行。从我的 dll 文件调用第一个调试器函数时出现问题,就在我在日志中的 Print 语句下方,我收到以下错误:
- Cannot find 'debugger', in 'simpleFunctions.dll'
- unresolved import function call
- OnInit critical error
- tester stopped because OnInit failed
我不满地搜索了整个互联网,发现没有人真正以实用的方式回答这个问题。我怀疑错误可能在于数据类型差异方面的 C# 方面,但我真的不知道从哪里继续查看这一点。任何帮助将不胜感激。
好吧,在可能在每个网站上搜索与我的问题相关的答案之后,切换回 python 并尝试使用不同的方式连接到 mql5(使用套接字),而不是最终尝试 C++ 并花费最后两个时间几天学习,我想我终于解决了我的问题。仅发布此内容以帮助将来可能遇到类似问题的任何人。我认为由于 MQL5 更像是 C++ 而不是 C#,因此链接过程会更容易一些。它自身的代码一点也不复杂,因为我只是想从 C++ 获取 MQL5 中的函数 运行。
#include "pch.h"
#include "CPPMQLSQLConnector.h"
#define CPPMQLSQLCONNECTOR_API
#include <string>
std::string __stdcall myString(std::string Words)
{
static std::string myWords = "This is about to work I can feel it. ";
return myWords + Words;
}
int __stdcall myInt(int numbr)
{
static int myNumber = 1998;
numbr = 22;
return myNumber + numbr;
}
注意方法指针前的 __stdcall,需要调用约定让 MQL5 知道如何从库中获取函数。
在我的 C++ 头文件中,我让 C++ 知道我想使用“__declspec(dllexport)”和“__declspec(dllimport)”导出哪些函数,这是我对这个问题的看法价值与您为它付出的一样多,但我的理解是 export 关键字让 C++ 知道我想要导出哪些函数,而 import 关键字由 MQL5 或任何应用程序使用,以了解要导入哪些函数。我的头文件
#pragma once
#include <string>
#ifndef MYDLL
#define MYDLL
#ifdef CPPMQLSQLCONNECTOR_API
extern "C" __declspec(dllexport) std::string __stdcall myString(std::string Words);
extern "C" __declspec(dllexport) int __stdcall myInt(int numbr);
#else
extern "C" __declspec(dllimport) std::string __stdcall myString(std::string Words);
extern "C" __declspec(dllimport) int __stdcall myInt(int numbr);
#endif
#endif
我们使用 extern "C" 关键字让编译器知道它应该期待 'C' 代码。
最后是MQL5代码,非常简单。我们只需导入 dll 并开始使用这些函数来实现它们的目的
#import "CPPMQLSQLConnector.dll"
string myString(string s);
int myInt(int i);
#import
int OnInit()
{
string Word = "Momma I made it!!!!!!!!!!!!";
int numbr = 25;
Print("We definitely init ;D");
Print("La string: ", myString(Word));
Print("La integer: ", myInt(numbr));
return(INIT_SUCCEEDED);
}