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
Assembling 'C:\Users\internal228\AppData\Local\Temp\tmpAFBE\UELTest.x86.il' to DLL --> 'C:\Users\internal228\Documents\Visual Studio 2010\Projects\UnmanagedLibTest\UELTest\bin\Debug\x86\UELTest.dll'.
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#.
В последнее время я не просто много, а очень много экспериментирую с кодом, подходами, написаниями каких-то тестовых сценариев и приложений. Результат, конечно, всегда разный, ну да не об этом сегодня пойдет речь. Постепенно начинаешь уставать от настройки стандартных проектов. Для проекта библиотек надо удалить класс, создаваемый там по...
我希望 RGiesecke 能尽快回复,您可以通过以下网址进行跟踪
http://stackoverflow.com/questions/4642548/how-to-use-a-net-assembly-in-delphi-without-registering-it-in-the-gac-or-com/5497058#5497058
*非常感谢你写了这篇文章!它写得非常好,大量的示例也非常有帮助。
对我来说,最大的障碍是弄清变量类型以及如何来回传递它们(尤其是数组和字符串)。(一旦我学到了更多知识并创建了一些有用的库,我将看看是否能贡献出来。
您为我节省了很多时间,而不是通过反复试验来学习。
不胜感激! :-)
你好
我遇到了一个问题,我的 DLL函数 突然(?)返回错误信息 "无法在'TestMe.dll'中找到'Add'"。这是一个简单的示例,使用的是您的代码:
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));
}
}
--> 在'Testme.dll'中找不到'Add'。
调用 DLL 的方式有什么变化是我忽略的吗?
如果您有任何意见,我们将不胜感激
托马斯
您好
我也突然遇到了一个问题(一开始是正常的,但是......),当我编译示例 dll 时,我发现
Assembling 'C:\Users\internal228\AppData\Local\Temp\tmpAFBE\UELTest.x86.il' to DLL --> 'C:\Users\internal228\Documents\Visual Studio 2010\Projects\UnmanagedLibTest\UELTest\bin\Debug\x86\UELTest.dll'.
源文件是 UNICODE
***** FAILURE *****
UELTest
有什么遗漏的吗?
Windows 7;VisualStudio 2010;
如有任何意见,不胜感激。
Risan
** 更新** 已解决,谢谢!
您好、
我完全按照程序在 C# Express 2010 中编写了一个 dll,但模板不起作用,所以我在一个新项目中手动添加了 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)
请问问题出在哪里? 我检查过了,MT4 已经加载了 DLL,但它不想调用该函数。 我注意到在 MT4 中调用托管 DLL 时会出现这个问题,但本文中描述的过程应该可以解决问题,对吗?
如能得到帮助,将不胜感激
谢谢!
您好、
我想转达我对这篇文章的赞赏。
罗伯特-吉塞克网站的详细信息非常宝贵。
我学到了很多东西。当我更喜欢 VB.NET 时,不需要再写一个 C++ 封装程序是一件很酷的事情。
非常感谢。
干杯
戈登
我也有同样的问题
我也遇到了同样的问题....,我装饰的方法在 mt5 中找不到!
请帮助我!(我使用的是 vs2010 和模板)
已发布文章如何通过导出非托管代码从 MQL5 打开 C# 世界:
作者:investeo
在文章中https://www.mql5.com/zh/articles/249 作者编译的 dll 在 mt4 和 mt5 中正常工作!
但当我尝试从作者的源代码(在 VisualStudio 2010 中)创建我自己编译的 dll 时,该 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-sharp 中插入模板的位置和方式,原因显然只有这个 ,以及如何使用模板?
http://softblog.violet-tape.ru/2010/05/06/visual-studio-templates/
在 VS2010 的底部。
以及底部的有用信息。