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
*Огромное спасибо за эту статью! Она очень хорошо написана, а множество примеров очень полезны.
Большим препятствием для меня было разобраться с типами переменных и тем, как передавать их туда и обратно. (Было бы здорово увидеть несколько общих библиотек C# для Metatrader. Как только я узнаю больше и создам несколько полезных библиотек, я посмотрю, смогу ли я их предоставить.
Вы сэкономили мне кучу времени, вместо того чтобы учиться методом проб и ошибок. Спасибо, что делитесь своими знаниями.
У меня проблема, что внезапно (?) моя DLL функция возвращает сообщение об ошибке "Cannot find 'Add' in 'TestMe.dll'". Вот простой пример, использующий ваш код:
using System; using System.Text; using RGiesecke.DllExport; using System.Runtime.InteropServices;
namespace Testme { class Test {
[DllExport("Add", CallingConvention = CallingConvention.StdCall)] publicstaticint Add(int left, int right) { return left + right; } } }
Использование в файле .mql:
#import "Testme.dll" int Add(int left,int right); #import
У меня тоже внезапно возникла проблема (сначала все работало, но ...), когда я скомпилировал образец dll, я получил
Сборка 'C:\Users\internal228\AppData\Local\Temp\tmpAFBE\UELTest.x86.il' в DLL --> 'C:\Users\internal228\Documents\Visual Studio 2010\Projects\UnmanagedLibTest\UELTest\bin\Debug\x86\UELTest.dll'
Я полностью следовал процедуре написания dll в C# Express 2010. Шаблон не работал, поэтому я вручную добавил файлы dll в новый проект, и все скомпилировалось хорошо (возможно, я сделал что-то не так).
Я написал две простые функции, чтобы проверить, работает ли это, и тестирую из Metatrader 4. Я получаю следующую ошибку:
2011.10.29 20:13:37 2000.01.03 00:00 Expert_NN_1_1 USDJPY,H1: cannot call function 'sum' from dll 'NN 1 DLL.dll'(error 127).
Есть идеи, в чем может быть проблема? DLL загружена в MT4, я проверил, но она не хочет вызывать функцию. Я заметил, что эта проблема возникает при попытке вызвать управляемую dll в MT4, но процедура, описанная в этой статье, должна решить эту проблему, правильно?
Большая просьба привести простейший пример функции написанной на С# для обращения к ней с мт4(или мт5) ........... Передать значения а и б в функцию с шарп и вернуть результат в мт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
В данной статье я представил различные методы взаимодействия между кодом, написанным на MQL5, и управляемым кодом на C#. Также я подготовил несколько примеров маршалинга структур MQL5 для C# и примеров вызова экспортированных функций DLL в скриптах на MQL5. Приведенные примеры могут служить основой для дальнейших исследований аспектов написания DLL в управляемом коде. Эта статья также открывает двери для использования в MetaTrader 5 множества библиотек, уже реализованных на C#.
В последнее время я не просто много, а очень много экспериментирую с кодом, подходами, написаниями каких-то тестовых сценариев и приложений. Результат, конечно, всегда разный, ну да не об этом сегодня пойдет речь. Постепенно начинаешь уставать от настройки стандартных проектов. Для проекта библиотек надо удалить класс, создаваемый там по...
I hope RGiesecke will answer soon, you can track it at
http://stackoverflow.com/questions/4642548/how-to-use-a-net-assembly-in-delphi-without-registering-it-in-the-gac-or-com/5497058#5497058
*Огромное спасибо за эту статью! Она очень хорошо написана, а множество примеров очень полезны.
Большим препятствием для меня было разобраться с типами переменных и тем, как передавать их туда и обратно. (Было бы здорово увидеть несколько общих библиотек C# для Metatrader. Как только я узнаю больше и создам несколько полезных библиотек, я посмотрю, смогу ли я их предоставить.
Вы сэкономили мне кучу времени, вместо того чтобы учиться методом проб и ошибок. Спасибо, что делитесь своими знаниями.
Это очень ценно! :-)
Привет
У меня проблема, что внезапно (?) моя DLL функция возвращает сообщение об ошибке "Cannot find 'Add' in 'TestMe.dll'". Вот простой пример, использующий ваш код:
using System;
using System.Text;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
namespace Testme
{
class Test
{
[DllExport("Add", CallingConvention = CallingConvention.StdCall)]
public static int Add(int left, int right)
{
return left + right;
}
}
}
Использование в файле .mql:
#import "Testme.dll"
int Add(int left,int right);
#import
void OnStart()
{
//---
for(int i=0; i<3; i++)
{
Print(Add(i,666));
}
}
--> Невозможно найти 'Add' в 'Testme.dll'
Может быть, я упустил какое-то изменение в способе вызова DLL?
Любое мнение будет высоко оценено
Томас
Привет
У меня тоже внезапно возникла проблема (сначала все работало, но ...), когда я скомпилировал образец dll, я получил
Сборка 'C:\Users\internal228\AppData\Local\Temp\tmpAFBE\UELTest.x86.il' в DLL --> 'C:\Users\internal228\Documents\Visual Studio 2010\Projects\UnmanagedLibTest\UELTest\bin\Debug\x86\UELTest.dll'
Исходный файл - UNICODE
***** FAILURE *****
UELTest
Я что-то упустил?
Windows 7; VisualStudio 2010;
Любое мнение будет высоко оценено.
Рисан
**UPDATE** Разобрались с этим, спасибо!
Привет,
Я полностью следовал процедуре написания dll в C# Express 2010. Шаблон не работал, поэтому я вручную добавил файлы dll в новый проект, и все скомпилировалось хорошо (возможно, я сделал что-то не так).
Я написал две простые функции, чтобы проверить, работает ли это, и тестирую из Metatrader 4. Я получаю следующую ошибку:
2011.10.29 20:13:37 2000.01.03 00:00 Expert_NN_1_1 USDJPY,H1: cannot call function 'sum' from dll 'NN 1 DLL.dll'(error 127).
Есть идеи, в чем может быть проблема? DLL загружена в MT4, я проверил, но она не хочет вызывать функцию. Я заметил, что эта проблема возникает при попытке вызвать управляемую dll в MT4, но процедура, описанная в этой статье, должна решить эту проблему, правильно?
Любая помощь будет оценена по достоинству
Спасибо!
Здравствуйте,
Хотел бы выразить свою признательность за столь хорошо написанную статью.
Информация о сайте Роберта Гизеке была бесценна.
Я узнал много нового. Отсутствие необходимости писать еще одну обертку для C++, когда я предпочитаю VB.NET, - это здорово.
Большое спасибо.
Будьте здоровы,
Гордон
Привет,
У меня та же проблема.... методы, которые я украшаю, не найдены в mt5!!!
Пожалуйста, помогите! (я использую vs2010 и шаблон)
Опубликована статья Как открыть мир C# из MQL5 путем экспорта неуправляемого кода:
Автор: investeo
в статье 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));
}
//+------------------------------------------------------------------+
и как шаблон задействовать?
кто знает куда и как вставляются шаблоны в с шарпе, причина видимо только в этом
и как шаблон задействовать?
http://softblog.violet-tape.ru/2010/05/06/visual-studio-templates/
внизу для VS2010
и полезная инфа в самом низу