Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Kommunikation zw. Dll und Exe in einer Solution
Mazzo123
myCSharp.de - Member



Dabei seit:
Beiträge: 5

Themenstarter:

Kommunikation zw. Dll und Exe in einer Solution

beantworten | zitieren | melden

Hallo zusammen,

möchte meine GUI in einen Exe-Projekt implementieren. Die Logik befindet sich in der selben Solution, allerdings in einen Dll-Projekt. Nun möchte ich Events in beide Richtungen senden können.

Z.B.

Dll ließt Daten von einen Port, wurden die Daten verifiziert, sollen diese Daten der Exe (GUI) gesendet werden.

In der GUI kann durch Eingabe eines Datums das senden über die Dll ausgelöst werden. Dazu soll das Datum der Dll gesendet werden.

Nun ist es doch so, das ich in meiner Solution die Projekte gegenseitig referenzieren müsste, was ja aber nicht möglich ist (Henne - Ei Problem).

Wie geht man hier vor?

Beispiel im Code:

Dll:
Event auslösen: Instance.receivedData(1)

public delegate void ReceivedData(int function);
public event ReceivedData receivedData;

Exe:
Dll.Instance.receivedData += new Dll.ReceivedData(Received);

Diese funktioniert, wenn ich die Dll als Referenz im Exe-Projekt angeben. Nur wie bekomme ich dann den umgekehrten Weg hin?

Bitte um Hilfe!

Super, danke allen die mir nur einen Clou geben können,

Mazzo
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.170
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,

Deine .exe sollte die .dll (Bibliothek) kennen aber nicht umgekehrt.

Da Du ja vermutlich Objekte aus der .dll innerhalb der .exe erzeugst, kannst Du ja da über public Member oder ein Interface (was ja wieder auf public Member hinausläuft) die erforderlichen Werte direkt setzen.

Gruß, MarsStein

Edit: Die Richtung von der Dll zur exe läuft natürlich weiter über events.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MarsStein am .
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
markus111
myCSharp.de - Member

Avatar #avatar-3108.png


Dabei seit:
Beiträge: 479
Herkunft: Henstedt-Ulzburg

beantworten | zitieren | melden

Hallo,

ich frag mich gerade, wo dein Problem liegt?

Die DLL kann doch Daten empfangen, also in einen Buffer schreiben und senden. Und deine GUI ebenfalls.

mfg.
markus111

EDIT: MarsStein war schneller
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von markus111 am .
private Nachricht | Beiträge des Benutzers
Tarion
myCSharp.de - Member



Dabei seit:
Beiträge: 381

beantworten | zitieren | melden

Die DLL ist wie der Name schon sagt eine "Dynamic Link Library" kann also von überall Dynamisch gelinkt werden und sollte keine Kenntnisse darüber haben von wem sie gelinkt wird.
Daher kann sie sehr wohl events werfen wie du ja auch schon machst. Jedoch widerspricht es dem Sinn einer dll events zu abonnieren. Es ist eine "library" die genutzt werden will.
Also Kommunikation Exe -> dll = Funktionsaufrufe
Und dll -> Exe = events
Was spricht gegen dieses Vorgehen. Eventuell solltest du Code aus der dll in die exe schieben um dem Sinn einer dll gerecht zu werden.
private Nachricht | Beiträge des Benutzers
Mazzo123
myCSharp.de - Member



Dabei seit:
Beiträge: 5

Themenstarter:

beantworten | zitieren | melden

Wow, ihr seid schnell! Danke für die Antworten.


Ok, die Aussagen denke ich, hab ich alle verstanden. Glaube ich habe dort eher programatisches Unverständnis:

Glaube mir ist es nun klar geworden dank Tarion:

Ich füge die Dll als Referenz meiner Exe zu. So kann ich die Dll-Events in der Exe abonieren. Kommunikation Dll-->Exe

Da ich nun aus meiner Exe die Dll kennen, kann ich Funktionsaufrufe in der Dll machen. Keine Events, so wie ich es ursprünglich vorsehen wollte.

Ok, das ist plausibel. Mach mich mal direkt wieder an die Arbeit.

Ziel ist übrigens eine Bluetoothkommunikaiton :-)

LG und einen schönen Abend
private Nachricht | Beiträge des Benutzers
Jochen1980
myCSharp.de - Member



Dabei seit:
Beiträge: 111

beantworten | zitieren | melden

Hallo Mazzo123,

würde gerne ähnliches machen: Die DLL soll über ein Event die EXE benachrichtigen. Hast du vielleicht hierzu einen Codeschnippsel für mich. Ich such mich hier schon seit Stunden dumm und dämlich und find dazu einfach nirgends ein Beispiel.

Vielen Dank, Jochen
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Jochen1980,

mit DLL und EXE hat das erstmal nichts zu tun. Wie man ein Event definiert, steht in de FAQ: [FAQ] Eigenen Event definieren. Danach muss man also sicher nicht stundenlang suchen.

herbivore
private Nachricht | Beiträge des Benutzers
Jochen1980
myCSharp.de - Member



Dabei seit:
Beiträge: 111

beantworten | zitieren | melden

Vielen Dank herbivore!

Hätte nicht gedacht, dass das alles ist. Dachte ich müßte zwingend eine entsprechende Methode in ein Interface packen.

Hab jetzt folgendes gemacht (vielleicht interessiert's ja jemanden)

DLL:

    
public event EventHandler<EventArgs> evtVarChanged;

public void OnVarChanged()
{
  EventHandler<EventArgs> myEvent = evtVarChanged;
  if (myEvent != null)
  {
    myEvent([MeinObjekt], null);
   }
}


und in meiner EXE:



public void init()
{
  [DLL-Ref].evtVarChanged += new EventHandler<EventArgs>(Client_evtVarChanged);

}

private void Client_evtVarChanged(object o, EventArgs e)
{
  // CODE
}

Das funktioniert bei mir, ich bekomme das entsprechende Event in der EXE.

Vielen Dank nochmals für den Link!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Jochen1980 am .
private Nachricht | Beiträge des Benutzers