Laden...

Kommunikation zw. Dll und Exe in einer Solution

Erstellt von Mazzo123 vor 14 Jahren Letzter Beitrag vor 13 Jahren 3.315 Views
M
Mazzo123 Themenstarter:in
5 Beiträge seit 2010
vor 14 Jahren
Kommunikation zw. Dll und Exe in einer Solution

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

3.170 Beiträge seit 2006
vor 14 Jahren

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.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

479 Beiträge seit 2008
vor 14 Jahren

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 😜

[Follow me on Twitter](http://twitter.com/blendingsky)
T
381 Beiträge seit 2009
vor 14 Jahren

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.

M
Mazzo123 Themenstarter:in
5 Beiträge seit 2010
vor 14 Jahren

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

J
111 Beiträge seit 2006
vor 13 Jahren

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

49.485 Beiträge seit 2005
vor 13 Jahren

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

J
111 Beiträge seit 2006
vor 13 Jahren

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!