Laden...

Daten aus einer DLL in zu einem Hauptprogramm senden?Wie??

Erstellt von Noob6666 vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.146 Views
N
Noob6666 Themenstarter:in
17 Beiträge seit 2018
vor 4 Jahren
Daten aus einer DLL in zu einem Hauptprogramm senden?Wie??

HI Leute,

hab im Forum gesucht aber leider nichts gefunden was mein problem beschreiben würde.
Ich bin nicht so oft hier, falls ich iwas übersehen habe, verzeiht es mir bitte, war nicht beabsichtigt.

Mein Problem im kurzen

Mein Projekt:
Habe eine DLL , worüber ich MT5 und VisualStudio verbinden möchte, weil ich in VisualStudio gerne programmieren möchte.

DLL eingebunden im MT5, ist auch ansprechbar und die Funktionen werden auch ausgeführt.
Dazu existiert eine Form-Projekt, welches über den Aufruf aus dem MT5 Skript, über die DLL erstellt wird.Ich starte nicht das Formprojekt dafür! Controls werden in der DLL dann zwischengespeichert die in der Form existieren.
Die GUI ist garnicht wichtig für mich, ich will nur Daten aus dem MT5 in das Form-Projekt übertragen können

Ich kann über Methoden der DLL, Daten aus dem MT5 ziehen wenn ich Sie über eine DLL Methode weitergeben an die DLL. Ich komm nur nicht drauf wie ich Sie an mein Hauptprogramm(Form-Projekt) weitergeben kann.

Ich hab folgendes versucht



//Hauptprogramm

        public Form1()
        {
            InitializeComponent();            
            NameDerDLL.SendeArray += SpeichereText;

        }
        public void SpeichereText(double[,,] daten)       
        {                                                
            string a = "";
            foreach (var item in daten)
            {
                a = a + item + "\n";
            }
            MessageBox.Show(a);       
        }

In der DLL wurde das ganze so abgelegt


//DLL
        public static double[,,] HighLows;
        public delegate void übergebeArray(ref double[,,] highLows);
        public static event übergebeArray SendeArray;
       
        public  void GetData(object sender, EventArgs e)
        {
            string text = "";
            foreach (var item in HighLows)
            {                
                text = text + item + "\n";
            };

            SendeArray(ref HighLows);
        }

        public static void SetData(ref double[,,] array)
        {
            HighLows = array;
        }

das hat leider nicht ge klappt, dann hab ich versucht das ganze über eine INvoke Methode zu machen


//Hauptprogramm

        public delegate void HoleDaten(string text);  
        public static event HoleDaten GetData;     

        public Form1()
        {
            InitializeComponent();            
            NameDerDLL.SendeArray += SpeichereText;
            GetData += SpeichereArray;

        }
        public void SpeichereText(ref double[,,] daten)        
        {                                                 
            string a = "";
            foreach (var item in daten)
            {
                a = a + item + "\n";
            }
             Invoke(GetData,a);
        }
        void SpeichereArray(string textl)                  
        {
            MessageBox.Show(textl);
        }

Die Snippets für das Delegate hab ich aus einem alten Projekt übernommen, dass waren aber Klassen und keine DLLs worüber die Delegates angesprochen wurden.

Ich hoffe die Erklärung reicht euch.
Kann mir bitte einer sagen woran es genau liegt und wenn dass der falsche Weg ist, welcher wäre der richtige???

Die Exeption konnt ich abfangen, aber FIleNotExists ist nicht korrekt denn wenn ich die Delegate-Aufrufe raus nehme dann funtz das ganze, kann mir auch nicht erklären warum....

Fehlermeldung:
Contrroller(USDJPY, H1) debugging terminated
Contrroller(USDJPY, H1) System.Reflection.TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht. ---> System.Reflection.TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht. ---> System.IO.FileNotFoundException: Die Datei oder Assembly "MQL_CONN_V1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" oder eine Abhängigkeit davon wurde nicht gefunden.Das System kann die angegebene Datei nicht finden.
Contrroller (USDJPY, H1) bei MQL_C.Form1..ctor()
Contrroller (USDJPY, H1) --- Ende der internen Ausnahmestapelüberwachung ---
Contrroller (USDJPY, H1) bei System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
Contrroller(USDJPY, H1) bei System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
Contrroller(USDJPY, H1) bei System.Activator.CreateInstance(Type type, Boolean nonPublic)
Contrroller(USDJPY, H1) bei System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, StackCrawlMark& stackMark)
Contrroller(USDJPY, H1) bei System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
Contrroller(USDJPY, H1) bei System.Reflection.Assembly.CreateInstance(String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
Contrroller(USDJPY, H1) bei System.Reflection.Assembly.CreateInstance(String typeName)
Contrroller(USDJPY, H1) bei MQL_CONN_V1.Controller.FindForm(Assembly assembly, String form_name)
Contrroller(USDJPY, H1) bei MQL_CONN_V1.Controller.GetController(String assembly_path, String form_name)
Contrroller(USDJPY, H1) bei MQL_CONN_V1.Controller.ShowForm(String assembly_path, String form_name)
Contrroller(USDJPY, H1) --- Ende der internen Ausnahmestapelüberwachung ---
Contrroller(USDJPY, H1) bei System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
Contrroller(USDJPY, H1) bei System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
Contrroller(USDJPY, H1) bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
Contrroller(USDJPY, H1) bei Wrapper.Wrapper.Call(MethodInfo method, Int64 owner, Int64 parameters, Int64 result)

4.938 Beiträge seit 2008
vor 4 Jahren

Benötigt deine Assembly "MQL_CONN_V1" noch andere Assemblies (DLLs)?
Überprüfe evtl. mal mit dem DependencyWalker.Net die Abhängigkeiten.

5.658 Beiträge seit 2006
vor 4 Jahren

Die Fehlermeldung ist doch ziemlich eindeutig:

Fehlermeldung:
System.IO.FileNotFoundException: Die Datei oder Assembly "MQL_CONN_V1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" oder eine Abhängigkeit davon wurde nicht gefunden.

Die Datei muß im Anwendungsverzeichnis liegen oder im Global Assembly Cache liegen.

Ansonsten empfehle ich einen Blick in [Artikel] C#: Richtlinien für die Namensvergabe und in die Doku bezüglich dem ref-Schlüsselwort.

Weeks of programming can save you hours of planning

N
Noob6666 Themenstarter:in
17 Beiträge seit 2018
vor 4 Jahren

@Th69

die einzigen Verweise die ich drin hab sind aus .Net



using System;
using System.Collections.Generic;
using System.Reflection;
using System.Threading;
using System.Windows.Forms;

mehr hab ich nicht drin.

Der DepencyWalker hat mir nur die mccorelib mit angezeigt die durch die dlls aber selber nicht eingepflegt werden muss, habs grad probiert um da nochmal Gewissheit zu haben.

@MrSparkle Sie liegt im Anwendungsverzeichnis, wie gesagt sobald ich die delegate aufrufe weg nehme
funzt wieder alles ohne Exceptions. probier schon so viel aus wie ich kann/weiß bevor ich mich an foren wende, bin leider am ende mit meinem latein..... bin aber auch kein senior progger

5.658 Beiträge seit 2006
vor 4 Jahren

Diesen Teil mußt du auch beachten:

Fehlermeldung:
oder eine Abhängigkeit davon wurde nicht gefunden.

Der Hinweis von Th69 bezog sich auf MQL_CONN_V1. Es geht um deren Abhängigkeiten.

Weeks of programming can save you hours of planning