Обсуждение статьи "Как открыть мир C# из MQL5 путем экспорта неуправляемого кода"

 

Опубликована статья Как открыть мир C# из MQL5 путем экспорта неуправляемого кода:

В данной статье я представил различные методы взаимодействия между кодом, написанным на MQL5, и управляемым кодом на C#. Также я подготовил несколько примеров маршалинга структур MQL5 для C# и примеров вызова экспортированных функций DLL в скриптах на MQL5. Приведенные примеры могут служить основой для дальнейших исследований аспектов написания DLL в управляемом коде. Эта статья также открывает двери для использования в MetaTrader 5 множества библиотек, уже реализованных на C#.

Рисунок 2. Модель COM-взаимодействия (COM Interoperability)

Автор: investeo

 

Очень полезная статья! Спасибо за подробное изложение.
 
Academic:

Очень полезная статья! Спасибо за подробное изложение.

Угу, спасибо.

Эх, старались-старались Метаквоты повысить быстродействие, уйти от байт-кода... а мы все равно все программы в него засунем! )))

Вопрос к автору: производились ли сравнительные тесты времени выполнения чистых MQL5-программ, DLL и .NETомонстров? Было бы интересно на них взглянуть.

 
alsu:

Угу, спасибо.

Эх, старались-старались Метаквоты повысить быстродействие, уйти от байт-кода... а мы все равно все программы в него засунем! )))

Вопрос к автору: производились ли сравнительные тесты времени выполнения чистых MQL5-программ, DLL и .NETомонстров? Было бы интересно на них взглянуть.

Присоединяюсь к вопросу. Интересно время выполнения для MQL, VB.NET(управляемый), С++(управляемый/неуправляемый), С#(управляемый/неуправляемый). И еще вопрос ко всем. Где (кроме VB - там можно) можно использовать динамические массивы, чтобы код из MQL5 без переделок перенести в более быструю программу или DLL. В VB все есть почти один в один, как в MQL(операторы по работе с динамическими массивами), а в каких языках тоже есть все необходимое?
 
alsu:

Угу, спасибо.

Эх, старались-старались Метаквоты повысить быстродействие, уйти от байт-кода... а мы все равно все программы в него засунем! )))

Вопрос к автору: производились ли сравнительные тесты времени выполнения чистых MQL5-программ, DLL и .NETомонстров? Было бы интересно на них взглянуть.

Это от какого-такого байт-кода они уходили? В четверке что ли он был? Там был просто медленный компилятор без оптимизации.

Под .NET нет никакого байт-кода, при запуске все компилится в нативный машинный код, с оптимизацией под конкретный проц. Если критично время на первую компиляцию, используйте ngen  http://msdn.microsoft.com/ru-ru/library/6t9t5wcf.aspx

А тесты да... было бы интересно

Автору большой респект за проделанную работу, я лично использую всего 2 метода из описанных, про остальные только слышал. Правда не понял, как может помочь COM-интероп, ну это наверное для полноты картины было изложено. Статья на 5.

Ngen.exe (генератор образов в машинном коде)
Ngen.exe (генератор образов в машинном коде)
  • msdn.microsoft.com
Внимание Единственный сценарий, в котором необходимо устанавливать зависимость отдельно — это загрузка зависимости приложением с помощью отражения, например путем вызова метода . Важно Примечание Формирование образов для различных сценариев Например, при выполнении сборки в рамках...
 
VDev:

Это от какого-такого байт-кода они уходили? В четверке что ли он был? Там был просто медленный компилятор без оптимизации.

В MQL4 был байт код, а MQL5 компилируется в байткод с последующей докомпиляцией в нативный x86 или x64 перед исполнением. MQL5 ведет себя как .NET

MQL5 как язык будет дальше развиваться (девелоперы требуют бОльшего функционала и лучшей совместимости с C++), а его оптимизатор улучшаться.

К последних билдах появилась возможность включения ресурсов (.BMP и .WAV) напрямую в EX5 файлы через #resource, что позволяет создавать самодостаточные приложения. Это хороший задел для разработки и продажи полноценных приложений для платформы MetaTrader 5. Скоро выйдет бета-версия MQL5 Market, где любой разработчик сможет продавать свои программы (после жесткой модерации), а все трейдеры получат прямой доступ к этому магазину.

 

У меня одного не компилируются шаблоны для unmanaged export для VS C#?

Брал шаблон из статьи (он не полный, не хватает dll) дополнял его библиотеками от R. Giesecke взятыми тут http://sites.google.com/site/robertgiesecke/Home/uploads,

брал оригинальный шаблон от R. Giesecke, также делал смесь двух шаблонов, ничего не выходит.

При компиляции оригинального шаблона компилятор выдает следующее:

------ Построение начато: проект: UnmanagedExportLibrary8, Конфигурация: Debug Any CPU ------
Построение начато 15.03.2011 19:02:04.
CoreCompile:
  C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /noconfig /nowarn:1701,1702 /nostdlib+ /errorreport:prompt /define:DEBUG;TRACE /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll" /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /debug+ /debug:full /out:obj\Debug\UnmanagedExportLibrary8.dll /target:library DllExport\DllExportAttribute.cs UnmanagedExports.cs Properties\AssemblyInfo.cs
CopyFilesToOutputDirectory:
  Копирование файла из "obj\Debug\UnmanagedExportLibrary8.dll" в "bin\Debug\UnmanagedExportLibrary8.dll".
  UnmanagedExportLibrary8 -> d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\bin\Debug\UnmanagedExportLibrary8.dll
  Копирование файла из "obj\Debug\UnmanagedExportLibrary8.pdb" в "bin\Debug\UnmanagedExportLibrary8.pdb".
AfterBuild:
  ILDasm: calling 'C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\ildasm.exe' with /quoteallnames /unicode /nobar /linenum "/out:c:\Temp\tmpF417\UnmanagedExportLibrary8.il" "d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\bin\Debug\UnmanagedExportLibrary8.dll"
  ILDasm: ildasm 'C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\ildasm.exe' returned gracefully.
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\bin\Debug\UnmanagedExportLibrary8.dll : Export warning EXP0009: Platform is AnyCpu, creating binaries for each CPU platform in a separate subfolder...
  ILAsm: Found method: UnmanagedExportLibrary8.UnmanagedExports..method private hidebysig static float64 'AddDays'(float64 'dateValue', int32 'days') cil managed
  ILAsm: Removing RGiesecke.DllExport.DllExportAttribute from UnmanagedExportLibrary8.UnmanagedExports.AddDays
  ILAsm: Parsing 242 lines of IL took 66 ms.
  ILAsm: calling 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\ILAsm.exe' with /nologo "/out:d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\bin\Debug\x86\UnmanagedExportLibrary8.dll" "c:\Temp\tmpF417\UnmanagedExportLibrary8.x86.il" /DLL "/resource=c:\Temp\tmpF417\UnmanagedExportLibrary8.res"  /debug  
  ILAsm: ILAsm 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\ILAsm.exe' returned gracefully.
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : 
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembling 'c:\Temp\tmpF417\UnmanagedExportLibrary8.x86.il'  to DLL --> 'd:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\bin\Debug\x86\UnmanagedExportLibrary8.dll'
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Source file is UNICODE
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : 
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::.ctor
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::.ctor
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::.ctor
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::get_CallingConvention
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::set_CallingConvention
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::get_ExportName
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::set_ExportName
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : 
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : ***** FAILURE ***** 
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : 
     в RGiesecke.DllExport.Parsing.IlParser.RunILTool(String installPath, String toolFileName, String requiredPaths, String workingDirectory, String settingsName, String arguments, String toolLoggingCode, String verboseLoggingCode, DllExportNotifier notifier, Int32 timeout)
     в RGiesecke.DllExport.Parsing.ILAsm.RunCore(CpuPlatform cpu, String fileName, String ressourceParam, String ilSuffix)
     в RGiesecke.DllExport.Parsing.ILAsm.Run(String outputFile, String ilSuffix, CpuPlatform cpu)
     в RGiesecke.DllExport.Parsing.ILAsm.ReassembleFile(String outputFile, String ilSuffix, CpuPlatform cpu)
     в RGiesecke.DllExport.DllExportWeaver.RunILAsm(ILAsm ilAsm)
     в RGiesecke.DllExport.DllExportWeaver.Run()
     в RGiesecke.DllExport.MSBuild.DllExportTask.Execute()

СБОЙ построения.

Затраченное время: 00:00:01.85
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

 При компиляции других шаблонов примерно тоже самое.

Система: W7 x64 SP1 Home Prem Lic.

IDE: VS 2010.

Google не помогает (.

Создавал проект dll вручную и дополнял его в соответствии с рекомендациями R. Giesecke, результата также нет.

Помогите плиз советом. 

Robert Giesecke
  • sites.google.com
Deployed as nuget package!no longer limited to C#!VS 2008 is no longer supported (it has no nuget support)Various fixes regarding path reslution for ildasm.exe, ilasm.exe and lib.exeexport names are escaped, so using il keywords like add won't be a problem any moreThe task will only execute when you have selected a specific CPU target (x86...
 
kPVT:

I have not compiled a template for the unmanaged export to VS C #?

Took a template from the article (it is not complete, not lacking dll) adds to the libraries of R. Giesecke taken here http://sites.google.com/site/robertgiesecke/Home/uploads ,

took the original template from R. Giesecke, as did a mixture of two templates, it does not work.

When compiling the original template compiler generates the following:

 When compiling other patterns about the same.

System: W7 x64 SP1 Home Prem Lic.

IDE: VS 2010.

Google does not help (.

Dll manually create a project and complements it in accordance with the recommendations of R. Giesecke, the result is also unavailable.

Help pliz advice. 

 

Hi kPVT,

Is there something Windows7 - XP backward compatibility mode ind Win7? If the dll works in 32-bit mode, it means it has to be recompiled to 64bits to make it work.

I will try to ask RGiesecke himself on stackoverflow.com.

Best Regards,

Investeo

 

 
How to use a .Net Assembly in Delphi without registering it in the GAC or COM?
How to use a .Net Assembly in Delphi without registering it in the GAC or COM?
  • stackoverflow.com
i have a simple task: is it possible to write a Delphi DLL and put a .Net Assembly (with only one interface with 4 methods and one class implementing the interface) besides it and call it from the
 
Большая просьба привести простейший пример функции написанной на С# для обращения к ней с мт4(или мт5) ........... Передать значения а и б в функцию с шарп и вернуть результат в мт4(мт5)

в статье https://www.mql5.com/ru/articles/249 компилированная dll автора работает и в мт4 и в мт5 исправно!

но когда я пытаюсь создать свою компилированную DLL с исходников автора (в VisualStudio 2010) то у меня эта dll не работает(пишет ошибка 127)

все версии .NET установлены


// код C#

using System;
using System.Text;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;



namespace TEST
{
class TEST
{
[DllExport("Add", CallingConvention = CallingConvention.StdCall)]
public static int Add(int left, int right)
{
return left + right;
}
}
}



namespace RGiesecke.DllExport
{

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
partial class DllExportAttribute : Attribute
{
public DllExportAttribute()
{
}
public DllExportAttribute(string exportName)
: this(exportName, CallingConvention.StdCall)
{
}
public DllExportAttribute(string exportName, CallingConvention callingConvention)
{
ExportName = exportName;
CallingConvention = callingConvention;
}
public CallingConvention CallingConvention { get; set; }
public string ExportName { get; set; }
}
}


// код МТ4
//+------------------------------------------------------------------+
#import "TEST.dll"
int Add(int a,int b);
#import

void start()
{
Comment(Add(3,2));
}
//+------------------------------------------------------------------+

В чем ошибка?
Как открыть мир C# из MQL5 путем экспорта неуправляемого кода
Как открыть мир C# из MQL5 путем экспорта неуправляемого кода
  • 2011.02.09
  • investeo
  • www.mql5.com
В данной статье я представил различные методы взаимодействия между кодом, написанным на MQL5, и управляемым кодом на C#. Также я подготовил несколько примеров маршалинга структур MQL5 для C# и примеров вызова экспортированных функций DLL в скриптах на MQL5. Приведенные примеры могут служить основой для дальнейших исследований аспектов написания DLL в управляемом коде. Эта статья также открывает двери для использования в MetaTrader 5 множества библиотек, уже реализованных на C#.
 
кто знает куда и как вставляются шаблоны в с шарпе, причина видимо только в этом

и как шаблон задействовать?
Причина обращения: