Discussione sull’articolo "Esposizione del codice C# in MQL5 utilizzando esportazioni non gestite"

 

Il nuovo articolo Esposizione del codice C# in MQL5 utilizzando esportazioni non gestite è stato pubblicato:

In questo articolo ho presentato diversi metodi di interazione tra il codice MQL5 e il codice gestito C#. Ho anche fornito diversi esempi su come eseguire il marshalling di strutture MQL5 contro C# e come richiamare le funzioni DLL esportate negli script MQL5. Credo che gli esempi forniti possano servire come base per ricerche future sulla scrittura di DLL nel codice gestito. Questo articolo apre anche le porte a MetaTrader per utilizzare le tante librerie che sono già implementate in C#.

Component Object Model (COM) è uno standard di interfaccia binaria introdotto da Microsoft all'inizio degli anni novanta. L'idea centrale di questa tecnologia è quella di consentire agli oggetti creati in diversi linguaggi di programmazione di essere utilizzati da qualsiasi altro oggetto COM senza conoscerne l'implementazione interna. Tale requisito impone l'implementazione di un'interfaccia rigorosa e ben definita del COM che è completamente separata dall'implementazione.

In effetti, COM è stato sostituito dalla tecnologia .NET e Microsoft spinge per utilizzare .NET invece di COM. Per fornire la compatibilità con le versioni precedenti del codice precedente, .NET può cooperare con COM in entrambe le direzioni, ovvero .NET può chiamare metodi COM e l'oggetto COM può utilizzare il codice gestito .NET.

Questa funzionalità è denominata interoperabilità COM o COM Interop. L'API di interoperabilità COM si trova nello spazio dei nomi System.Runtime.InteropServices gestito.

 

Figura 2. Modello di interoperabilità COM

Figura 2. Modello di interoperabilità COM 

Autore: investeo

 
Articolo molto utile! Grazie per la presentazione dettagliata.
 
Academic:

Articolo molto utile! Grazie per la presentazione dettagliata.

Sì, grazie a te.

Metaquotes ha cercato di migliorare le prestazioni, di allontanarsi dal byte-code... e noi ci infiliamo ancora tutti i programmi! )))

Domanda all'autore: sono stati eseguiti test comparativi dei tempi di esecuzione di programmi MQL5 puri, DLL e mostri .NET? Sarebbe interessante darci un'occhiata.

 
alsu:

Sì, grazie.

Metaquotes ha cercato di migliorare le prestazioni, di allontanarsi dal byte-code... e continueremo a infilarci dentro tutti i programmi! )))

Domanda all'autore: sono stati eseguiti test comparativi dei tempi di esecuzione di programmi MQL5 puri, DLL e mostri .NET? Sarebbe interessante darci un'occhiata.

Mi associo alla domanda. Sono interessato ai tempi di esecuzione di MQL, VB.NET (managed), C++ (managed/unmanaged), C# (managed/unmanaged). E un'altra domanda per tutti. Dove (tranne che in VB - lì è possibile) è possibile utilizzare gli array dinamici per trasferire il codice da MQL5 a un programma più veloce o a una DLL senza modifiche. In VB tutto è quasi identico a MQL (operatori per lavorare con gli array dinamici), ma quali linguaggi hanno anche tutto il necessario?
 
ciao,
Penso che
in linea di principio sia molto utile aprire le risorse possibili e trovo questo articolo molto interessante. Ma non sono un programmatore molto esperto e quindiho qualche domanda.

Dal mio punto di vista il codice non gestito mi dà la possibilità di sviluppare la piattaforma in modo indipendente. Ma se qualcuno usa Metatrader, ha una piattaforma definita.

Qual è il vantaggio con il codice non gestito in generale e in combinazione con MQL5 ? - Per favore correggetemi se ho capito male qualcosa!


 
smartwart:
ciao,
Penso che
in linea di principio sia molto utile aprire le risorse possibili e trovo questo articolo molto interessante. Ma non sono un programmatore molto esperto e quindiho qualche domanda.

Dal mio punto di vista il codice non gestito mi dà la possibilità di sviluppare la piattaforma in modo indipendente. Ma se qualcuno usa Metatrader, ha una piattaforma definita.

Qual è il vantaggio con il codice non gestito in generale e in combinazione con MQL5 ? - Per favore correggetemi se ho capito male qualcosa!


Ciao smartwart,

Il vantaggio è che c'è una grande quantità di codice già sviluppato in C# che si può utilizzare per il trading. Potrai leggere di più nel mio prossimo articolo.

cheerz,

Investeo

 

Questa è la cosa migliore in assoluto! Adoro C# e stavo cercando qualsiasi possibilità per farlo funzionare! La migliore notizia dell'anno! Credo che questa sia stata l'ultima volta in cui ho scritto un EA in MQL5. Metterò tutta la logica nelle librerie e userò un modello EA.mq5 per tutti i miei EA (solo che saranno collegati con librerie diverse).

Grazie!

 
alsu:

Sì, grazie.

Metaquotes ha cercato di migliorare le prestazioni, di allontanarsi dal byte-code... e continueremo a infilarci dentro tutti i programmi! )))

Domanda all'autore: sono stati eseguiti test comparativi dei tempi di esecuzione di programmi MQL5 puri, DLL e mostri .NET? Sarebbe interessante dare un'occhiata.

Da quale bytecode si sono allontanati? Lo avevano in 4? C'era solo un compilatore lento senza ottimizzazione.

In .NET non c'è bytecode, all'avvio tutto viene compilato in codice macchina nativo, con ottimizzazione per un particolare processore. Se il tempo per la prima compilazione è critico, usare ngen http://msdn.microsoft.com/ru-ru/library/6t9t5wcf.aspx.

E i test sì... sarebbe interessante

Personalmente utilizzo solo 2 dei metodi descritti, ho solo sentito parlare degli altri. Non ho capito come COM-interop possa essere d'aiuto, ma questo è probabilmente per completezza del quadro. L'articolo è il 5.

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

Da che tipo di codice byte si sono allontanati? Lo avevano in 4? C'era solo un compilatore lento senza ottimizzazione.

MQL4 aveva il bytecode, mentre MQL5 è compilato in bytecode con una successiva precompilazione in x86 o x64 nativo prima dell'esecuzione. MQL5 si comporta come .NET

Il linguaggio MQL5 sarà ulteriormente sviluppato (gli sviluppatori chiedono più funzionalità e una migliore compatibilità con il C++) e il suo ottimizzatore sarà migliorato.

Nelle ultime versioni, è ora possibile includere risorse (.BMP e .WAV) direttamente nei file EX5 tramite #resource, il che consente di creare applicazioni autosufficienti. Si tratta di una buona base per lo sviluppo e la vendita di applicazioni complete per la piattaforma MetaTrader 5. La versione beta del Mercato MQL5 sarà rilasciata a breve, dove ogni sviluppatore potrà vendere le proprie applicazioni (dopo una rigorosa moderazione), e tutti i trader avranno accesso diretto a questo negozio.

 

Sono l'unico che non riesce a compilare i modelli per l'esportazione non gestita per VS C#?

Ho preso il modello dall'articolo (non è completo, manca la dll) e l'ho integrato con le librerie di R. Giesecke prese qui. Librerie di Giesecke prese qui http://sites.google.com/site/robertgiesecke/Home/uploads,

ha preso il modello originale da R. Giesecke, ho anche fatto una miscela dei due modelli, ma non è venuto fuori nulla.

Quando si compila il template originale il compilatore dà il seguente risultato:

------ Построение начато: проект: 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 ==========

Durante la compilazione di altri template circa lo stesso.

Sistema: W7 x64 SP1 Home Prem Lic.

IDE: VS 2010.

Google non aiuta (.

Ho creato manualmente la dll del progetto e l'ho integrata secondo le raccomandazioni di R. Giesecke, ma non ho ottenuto alcun risultato.

Vi prego di aiutarmi con un consiglio.

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:

Non ho compilato un modello per l'esportazione non gestita a VS C #?

Ho preso un modello dall'articolo (non è completo, non manca la dll) e lo aggiungo alle librerie di R. Giesecke preso qui http://sites.google.com/site/robertgiesecke/Home/uploads ,

ha preso il modello originale da R. Giesecke, come ha fatto una miscela di due modelli, non funziona.

Quando si compila il modello originale il compilatore genera quanto segue:

Quando si compilano altri modelli circa lo stesso.

Sistema: W7 x64 SP1 Home Prem Lic.

IDE: VS 2010.

Google non aiuta (.

Dll crea manualmente un progetto e lo completa in conformità con le raccomandazioni di R. Giesecke, il risultato è anche non disponibile.

Aiuto pliz consiglio.

Ciao kPVT,

C'è qualcosa Windows7 - XP modalità di retrocompatibilità ind Win7? Se la dll funziona in modalità 32 bit, significa che deve essere ricompilata a 64 bit per farla funzionare.

Proverò a chiedere a RGiesecke stesso su stackoverflow.com.

Cordiali saluti,

Investeo