我在C#中写了一个 DLL
,这是从用 MQL4
编写的代码调用的(基本上是类似于C语言)并发送回一些数据(未管理到托管和返回)。
通常,DLL
会向 MySQL
-host发送查询,并在需要时返回一些数据。我使用了 NuGet 包“非托管导出”。
我将此DLL
用于外汇交易 MetaTrader终端 程序,在Windows 8.1 x64上运行,一切运行良好。 C#代码是在x86中编译的,因为 MetaTrader终端仅在x86上运行。
现在我有兴趣使用相同的DLL
并使用相同的代码调用它,但这次我需要从VPS运行代码。
此VPS在Windows Server 2008 R2 SP1 x64上运行。
除此之外一切都是一样的:相同版本的 MetaTrader终端,我甚至安装了VS 2013(与我在笔记本电脑上使用的版本相同) VPS和编译C#代码没有问题。
我还安装了Microsoft Visual C ++ 2010 Redistributable,希望这能帮助但我还在这里......
也没有可能阻止访问主机的防火墙。
什么可能妨碍DLL
在VPS上运行?
谢谢!
我在VPS上写了一个简短的C#程序来检查DLL
。它(DLL
)效果很好。
我知道 MetaTrader终端确实识别DLL
,否则我会收到有关该基本问题的错误。
所以问题必须在 MetaTrader终端和DLL
之间。
答案 0 :(得分:1)
在其他正在运行的 MT4/DLL
合作计划中出现了一个问题,毫无疑问,防火墙不应该受到指责。 DLL
机制不包含防火墙需要关注的操作。
为了避免任何Win服务器设置,DLL
- 文件( s)进入最安全的位置,最近对 新 - MQL4.56789
的更改已设置默认位置不安全
- 所以不要像往常一样将文件放在MT4 〜终端目录〜 /MQL4/Library
上{{1 }}
请注意嵌套的localhost
来电
调用导入的函数
要在执行mql4程序期间导入函数,客户端终端使用早期绑定。这意味着如果程序调用了导入的函数,则在程序加载期间会加载相应的模块(ex4或dll)。 MQL4和DLL库在调用模块的线程中执行。
建议不要使用要加载的模块的完全指定名称,如Drive:\ Directory \ FileName.Ext。 MQL4库是从terminal_dir \ MQL4 \ Libraries文件夹加载的。如果找不到库,则客户端终端尝试从terminal_dir \ experts文件夹加载库。
系统库(DLL)由操作系统规则加载。如果库已经加载(例如,另一个EA交易,甚至是另一个客户端,并行运行),那么它会使用已加载库的请求。否则,它按以下顺序执行搜索:
- 目录,从中导入dll的模块已启动。这里的模块是EA交易,脚本,指标或EX4库;
- 目录terminal_data_directory \ MQL4 \ Libraries(TERMINAL_DATA_PATH \ MQL4 \ Libraries);
- 启动MetaTrader 4客户终端的目录;
- 系统目录;
- Windows目录;
- 当前目录;
- PATH系统变量中列出的目录。
如果DLL库在其工作中使用另一个DLL,则在没有第二个DLL时无法加载第一个DLL。
如果所有努力都失败了,那么使VPS托管解决方案独立于VPS提供商限制的一种可靠方法,以便最大限度地减少潜在非反应性风险的影响,将整个马戏团安装在您的内部 - 受控VM(通常是带有整个工作解决方案的简约wXP配置虚拟客户机,或者您可以" en-can"工作的localhost安装(不是您的整个笔记本,而是测试机))
所需的唯一适应是VPS主机安装Hypervisor系统(VmWare WorkStation或VM-Player)以及协调的IP地址,这不应该是匹配免费IP-s /端口#-s的问题根据需要。
虽然在项目上测试和工作顺利,但我不会从另一种方法开始,类似于linux / WINE瘦身的MetaTrader Terminal 4操作(实际上将 DLL
嵌入到{{ 1}} - 非Win O / S在WINE / linux适配器的周围群体后面提供的抽象)因为主要任务是消除DLL冲突的根源。