Ergebnis 1 bis 9 von 9
  1. #1
    Trojaner Avatar von sontyp
    Registriert seit
    16.09.2016
    Beiträge
    62

    Standard Zugriff auf Deligates einer C# DLL aus VB.NET heraus

    Moin Jungs,

    der eine oder andere erinnert sich vielleicht an das Projekt mit den Schranken, das mich bei der Arbeit beschäftigt hat.
    -> Ja! Ich bin immernoch dran, weil Kommunikation mit Kunden ja dann doch häufig schief läuft...

    Nun gibt es ein weiteres Gate mit einer völlig anderen Schranke (). Diese wird per Modbus Protokoll angesprochen.
    Ich hatte wenig Lust - und eigentlich auch nicht viel Zeit - ein eigenes Modbus Paket aufzusetzen und bin daher auf die Suche nach Bibliotheken gegangen und dabei unter anderem auf DIESE HIER gestoßen.
    Sah ganz so aus, als hätte sie alles was ich brauche und als würde sie noch maintained werden.

    Da bin ich dann nun auf folgendes Problem gestoßen:
    Jetzt gibt es Funktionen, die auf einen Rückgabewert verzichten. Wodurch sie zwar tun was sie sollen, aber mir nicht direkt eine Rückmeldung darauf geben, was der Modbus Server dazu sagt.
    Siehe HIER: void WriteSingleRegister(int StartingAddress, int Value)

    Nun hat der Mann glücklicher Weise einen Beispiel Client geschrieben und den Code dazu auf GitHub veröffentlicht, sodass es mir möglich war mal nachzugucken, wie er denn mit dem Response des Servers umgeht.

    Dort bin ich auf folgende Zeilen gestoßen:
    Code:
    modbusClient = new EasyModbus.ModbusClient();
    modbusClient.ReceiveDataChanged += new EasyModbus.ModbusClient.ReceiveDataChangedHandler(UpdateReceiveData);
    modbusClient.SendDataChanged += new EasyModbus.ModbusClient.SendDataChangedHandler(UpdateSendData);
    modbusClient.ConnectedChanged += new EasyModbus.ModbusClient.ConnectedChangedHandler(UpdateConnectedChanged);
    Da hab ich doch Interesse halber mal in den Code des Clients geschaut und folgendes entdeckt:
    Code:
    public delegate void ReceiveDataChangedHandler(object sender);
    public event ReceiveDataChangedHandler ReceiveDataChanged;
            
    public delegate void SendDataChangedHandler(object sender);
    public event SendDataChangedHandler SendDataChanged;
    
    
    public delegate void ConnectedChangedHandler(object sender);
    public event ConnectedChangedHandler ConnectedChanged;
    Er scheint also mittels Events darauf hinzuweisen(oder so ähnlich), dass sich was an den Daten geändert hat. Sprich, daher krieg ich die Response des Servers. Vermute ich jedenfalls.
    Ich hab versucht in meinem VB.NET Code genauso an die Events zu kommen, was mir leider überhaupt nicht gelungen ist.

    Einige Recherche hat ergeben, dass das so ohne weiteres nicht ganz so einfach möglich ist, wenn man versucht von VB auf C# Events/Delegates zuzugreifen.

    Leider kenne ich mich mit Delegates und Event orientierter Programmierung nicht so gut aus. Mir sind Funktionszeiger (was die Delegates ja gewissermaßen darstellen) aus C bekannt, leider bin ich aber bisher nicht so sehr in die Materie abgetaucht.

    Nun zu meiner Frage:
    Hat da jemand evtl. Erfahrung mit und kennt einen Weg oder kann mich zumindest soweit zu den technischen Hintergründen aufklären, dass ich mir da was zusammen fummeln kann?

    Bei meiner Recherche bin ich auf DIESEN Artikel von Microsoft gestoßen, konnt' den aber nicht ganz nachvollziehen und bin mir nicht mal richtigen sicher, ob es das richtige ist.

    Greetz,
    sontyp


    //EDIT:
    Eine Quick'n'Dirty Lösung hab ich bereits im Kopf: Eine C# DLL erstellen, die diese Events genauso anspricht, wie er in seinem Beispiel und sie dann entsprechend weiter gibt, sodass ich sie dann aus VB heraus ansprechen und abrufen kann.
    Ist aber wie gesagt Dirty und eigentlich nicht Sinn der Sache.
    Geändert von sontyp (17.05.2018 um 12:04 Uhr) Grund: Zusatz

    #define true (rand() > 10) //Happy debugging, suckers!



  2. #2
    Stanley Jobson Avatar von gORDon_vdLg
    Registriert seit
    23.07.2007
    Beiträge
    760

    Standard AW: Zugriff auf Deligates einer C# DLL aus VB.NET heraus

    Kannst dir ja den Beispielclient compilen und per dnSpy als VB decompilen^^ Dann siehst du auf jeden Fall wie das syntaxmäßig laufen muss. Kann mir ehrlich gesagt kaum vorstellen dass VB da nicht mit C# zusammen spielen möchte.

  3. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    sontyp (18.05.2018)

  4. #3
    Trojaner Avatar von sontyp
    Registriert seit
    16.09.2016
    Beiträge
    62

    Standard AW: Zugriff auf Deligates einer C# DLL aus VB.NET heraus

    Nun, so wie ich das verstehe, dient dnSpy ja eher dem decompilen von Assemblies. Den Code kann ich ja einsehen. In C#...
    Wozu ich das natürlich nutzen könnte ist, das Assembly komplett abzukupfern und für mich umzuändern. In Anbetracht der Tatsache, dass das eine kommerzielle Nutzung ist, sollte ich davon absehen.

    Kann mir ehrlich gesagt kaum vorstellen dass VB da nicht mit C# zusammen spielen möchte.
    Leider Gottes konnte ich gestern nach Stundenlangen Versuchen kein Ergebnis erzielen. Bin heute nicht im Büro und kann auch so natürlich keinen Closed Source Code hier veröffentlichen. Ich kann mal schauen, dass ich nachher mal ein kleines Beispiel aufsetze. Da kann man das dann gut sehen, denke ich.

    #define true (rand() > 10) //Happy debugging, suckers!



  5. #4
    Stanley Jobson Avatar von gORDon_vdLg
    Registriert seit
    23.07.2007
    Beiträge
    760

    Standard AW: Zugriff auf Deligates einer C# DLL aus VB.NET heraus

    Zitat Zitat von sontyp Beitrag anzeigen
    Nun, so wie ich das verstehe, dient dnSpy ja eher dem decompilen von Assemblies. Den Code kann ich ja einsehen. In C#...
    Ganz genau, ich meinte dein Beispiel von Github. C# compilen, IL kommt raus, decompiler macht aus IL wahlweise C# oder VB.

  6. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    sontyp (18.05.2018)

  7. #5
    Trojaner Avatar von sontyp
    Registriert seit
    16.09.2016
    Beiträge
    62

    Standard AW: Zugriff auf Deligates einer C# DLL aus VB.NET heraus

    Hmm. Ich könnte mir das schon mal ansehen, aber ich bin mir absolut nicht sicher, ob dabei sauberer Code rauskommt.

    #define true (rand() > 10) //Happy debugging, suckers!



  8. #6
    Stanley Jobson Avatar von gORDon_vdLg
    Registriert seit
    23.07.2007
    Beiträge
    760

    Standard AW: Zugriff auf Deligates einer C# DLL aus VB.NET heraus

    Nein, aber es gibt dir eine Idee davon wie das auszusehen hat, von der Umsetzung.

  9. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    sontyp (18.05.2018)

  10. #7
    Trojaner Avatar von sontyp
    Registriert seit
    16.09.2016
    Beiträge
    62

    Standard AW: Zugriff auf Deligates einer C# DLL aus VB.NET heraus

    Hab das mal gemacht heute.
    Lustiger Weise kam Code raus, den ich so eigentlich schon selbst ausprobiert hab. Der Zugriff ist also doch genauso wie unter C#.

    Ich hab das so Copy+Paste in meinen Code eingefügt und plötzlich ging alles.
    Keine Ahnung, wieso das plötzlich ging.

    Mit Sicherheit war an meinem ursprünglichen Zugriff noch was krumm... Ich werd da bei Zeiten, wenn es nicht gerade darum geht, Deadlines einzuhalten, mal versuchen hinter zu steigen.

    Danke für die Hilfe!

    Greetz,
    sontyp

    #define true (rand() > 10) //Happy debugging, suckers!



  11. #8
    Stanley Jobson Avatar von gORDon_vdLg
    Registriert seit
    23.07.2007
    Beiträge
    760

    Standard AW: Zugriff auf Deligates einer C# DLL aus VB.NET heraus

    Freut mich dass es dir geholfen hat

  12. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    sontyp (19.05.2018)

  13. #9
    Trojaner Avatar von sontyp
    Registriert seit
    16.09.2016
    Beiträge
    62

    Standard AW: Zugriff auf Deligates einer C# DLL aus VB.NET heraus

    So noch ma für alle, die das eventuell interessiert, hier die VB.NET Lösung für den Zugriff auf die erwähnten Delegates:
    Code:
    AddHandlerMe.modbusClient.ReceiveDataChanged,AddressOfMe.UpdateReceiveData
    AddHandlerMe.modbusClient.SendDataChanged,AddressOfMe.UpdateSendData
    AddHandlerMe.modbusClient.ConnectedChanged,AddressOfMe.UpdateConnectedChanged
    Greetz,
    sontyp

    #define true (rand() > 10) //Happy debugging, suckers!



Ähnliche Themen

  1. Port-Zugriff einer Anwendung ändern
    Von Karlito im Forum Suche Tutorials
    Antworten: 8
    Letzter Beitrag: 14.02.2012, 15:56
  2. Ist Seite XYZ down? Finde es heraus!
    Von enco im Forum Linkz
    Antworten: 11
    Letzter Beitrag: 25.07.2009, 02:14

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •