Советник с DLL на С# вылетает - страница 2

 
Спасибо большое за то, что потратили на меня время. Открыв Ваш файл, я сразу понял, в чём было дело: у меня в настройках компилировалось под X64... теперь и у меня сразу всё заработало
 
Максим Пругло:
Спасибо большое за то, что потратили на меня время. Открыв Ваш файл, я сразу понял, в чём было дело: у меня в настройках компилировалось под X64... теперь и у меня сразу всё заработало
Поздравляю с успехом. Но зачем C#  -  делал DLL на Delphi - можно окна с графиками, таблицами, ... Вызываются из MQL как функции
 
Увы не владею Delphi 
 

И всё-таки.. да, получилось выполнять численные операции или передавать сторку/массив и так далее. Но сделать что-то посложнее, например, скачать что-то с сайта, обработать с помощью дополнительных

using System.Net с его WebClient wc = new WebClient(); и затем HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

всё это уже вообще никак не работает, хотя должно ведь выполняться внутри DLL, я ведь в итоге обратно в МТ4 возвращаю лишь короткое строковое значение, найденное на сайте

 
Максим Пругло:

всё это уже вообще никак не работает, хотя должно ведь выполняться внутри DLL

работает

все, что не работает запустите в новом процессе внутри C# - я WinForm так запускал, даже ServiceStack.Redis взлетел под МТ4, правда не с первого раза ;)

 

Хорошо. Сделал так. Не хочет запускаться))

[DllExport("ShowBigMessage", CallingConvention = CallingConvention.StdCall)]
        public static int ShowBigMessage()
        {
            Thread thr = new Thread(delegate () { GetSiteInfo("https://ru.investing.com/economic-calendar/"); }); thr.Start();
            return 0;
        }

        private static void GetSiteInfo(string NewsLink)
        {
            WebClient wc = new WebClient(); wc.Encoding = Encoding.GetEncoding("utf-8");
            wc.Headers.Add("Host", "ru.investing.com");
            wc.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
            wc.Headers.Add("Accept-Language", "ru,en;q=0.9,es;q=0.8");
            wc.Headers.Add("User-Agent", @"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 YaBrowser/20.8.2.92 Yowser/2.5 Safari/537.36");
            string NewsPage = wc.DownloadString(new Uri(NewsLink));
            MessageBox.Show(NewsPage);
        }
 
Максим Пругло:

Хорошо. Сделал так. Не хочет запускаться))

конечно не будет работать  -нужно дать время для инициализации .Net - обычно около 0.5 секунд нужно подождать

сделайте некий dllOnInt() - который создаст Вам статические обьекты в отдельном потоке

затем проверяйте, что экземпляры обьектов успешно созданы

затем вызывайте их через обертки в статик функции с экспортом

затем уничтожьте обьекты и закройте поток - тоже нужно подождать около 0.5 сек - проверяйте опрашивая некий флаг

 
блин, а нет возможности пример что ли какой-то или накидать примерно, как это всё сделать)) а то я что-то не уверен, что до конца понимаю вышенаписанное...
 

выцарапал из готового  -клиент МТ4 для Redis

C#:

using System;
using System.Text;
using System.Threading;
using System.Runtime.InteropServices;
using ServiceStack.Redis;
using RGiesecke.DllExport;

namespace redismt4api
{
public static class redis
{
   private static IRedisNativeClient DB;
   private static Thread ClientThread;
   private static string current_host = "localhost";
   private static int    current_port = 6379;

   private static void NewClient()
   {
      DB = new RedisClient(current_host, current_port));
   }

   private static bool dbExcPing()()
   {
      if (ClientThread == null)
      {
         ClientThread = new Thread(NewClient);
         ClientThread.Start();
         return false;
      }
      if(DB == null) return false;
      return DB.Ping();
   }

   [DllExport("redismtconnect", CallingConvention = CallingConvention.StdCall)]
   public static bool redismtconnect([MarshalAs(UnmanagedType.LPWStr)]string host, int port)
   {
      current_host = host;
      current_port = port;
      return dbExcPing();
   }
}

MQL4:

int OnInit()
{
   int cnt = 30;
   while(!redismtconnect("localhost", 6379) && cnt-- > 0) Sleep(100);
}
 

Вот весь мой получившийся код:

MQL4:

#import "Test2.dll"
   bool SaveSiteText();
#import

int OnInit()
  {    
int cnt = 30;
   while(!SaveSiteText() && cnt-- > 0) Sleep(5000);
  }

C#:

using System;
using System.Text;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Net;
using HtmlAgilityPack;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows.Forms;
using System.IO;

namespace Test2
{
    public class Test22
    {
        private static Thread thr;
        private static string NewsPage="";

        [DllExport("SaveSiteText", CallingConvention = CallingConvention.StdCall)]
        public static bool SaveSiteText()
        {
            return procCreator();
        }

        private static bool procCreator()
        {
           if (thr == null)
           {
              thr = new Thread(delegate () { GetSiteInfo("https://ru.investing.com/economic-calendar/"); }); thr.Start();
              return false;
           }
           if(NewsPage == "") return false;
           return true;
   }

        private static void GetSiteInfo(string NewsLink)
        {
            WebClient wc = new WebClient(); wc.Encoding = Encoding.GetEncoding("utf-8");
            wc.Headers.Add("Host", "ru.investing.com");
            wc.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
            wc.Headers.Add("Accept-Language", "ru,en;q=0.9,es;q=0.8");
            wc.Headers.Add("User-Agent", @"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 YaBrowser/20.8.2.92 Yowser/2.5 Safari/537.36");
            NewsPage = wc.DownloadString(new Uri(NewsLink));
            File.WriteAllText(@"D:\1\1\1.txt", NewsPage);
        }
    }

}

И он отказывается работать, зараза.. ну всё ж вроде по подобию сделал, что ж такое... причём специально задержку аж в 5сек поставил, но МТ4 вылетает почти сразу, причём теперь закрывается весь терминал.

Причина обращения: