Aus Event einer Bibliothek Daten an Anwendung Schicken

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Nils_Kr.

    Aus Event einer Bibliothek Daten an Anwendung Schicken

    Hi,

    da die Bibliotek eines Funkscanners nicht mit VB funktionieren will, habe ich eine C#-Library in mein Projekt eingefügt. Prinzipiell funktioniert das auch. Das einzige Problem ist, dass in der Bibliothek ein Event registriert wird, welches feuert, wenn die Taste vom Scanner betätigt wird.
    Nur wie bekomme ich Daten aus der Funktion in das Projekt außerhalb der DLL?

    C#-Quellcode

    1. namespace ScannerModule {
    2. public class ScannerHelper {
    3. static CCoreScannerClass cCoreScannerClass;
    4. public static void setUpScanner() {
    5. cCoreScannerClass.BarcodeEvent += new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
    6. }
    7. static void OnBarcodeEvent(short eventType, ref string pscanData) {
    8. string barcode = pscanData; <- wie bekomme ich die Daten am Besten aus der Library raus?
    9. Console.WriteLine("Code:" + barcode);
    10. }
    11. }
    12. }


    PS: Ist klar, dass das Designtechnisch nicht die schönste Lösung ist, aber aktuell habe ich keine andere parat.
    Option strict = on

    If it's stupid and it works it ain't stupid.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Nils_Kr“ ()

    @Nils_Kr Wie ist denn das Event in der DLL deklariert?
    Üblicherweise werden Events so deklariert:

    C#-Quellcode

    1. public event EventHandler<MyEventArgs> MyEvent = delegate { };
    Das = delegate { } sorgt dafür, dass Du das Event aufrufen kannst, ohne dass es aboniert sein muss, das erspart den null-Test.
    Der Aufruf erfolgt dann so:

    C#-Quellcode

    1. MyEvent(this, new MyEventArgs(...))
    In der abonierenden Instanz sieht das so aus:

    C#-Quellcode

    1. MyInstance.MyEvent += MySpecialEventHandler;

    C#-Quellcode

    1. // ...
    2. private void MySpecialEventHandler(object sender, MyEventArgs e)
    3. {
    4. // ...
    5. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    @Nils_Kr Wie ist denn das Event in der DLL deklariert?


    So:
    cCoreScannerClass.BarcodeEvent += new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);

    Das ist zufällig auch die Zeile die ich nicht nach VB übersetzt bekomme.
    Option strict = on

    If it's stupid and it works it ain't stupid.
    @Nils_Kr Das ist nicht die Deklaration, sondern die Instanziierung.
    In VB.NET musst Du mit AddHandler arbeiten:

    VB.NET-Quellcode

    1. AddHandler MyInstance.MyEvent, AddressOf MySpecialEventHandler
    Das funktioniert natürlich nur, wenn OnBarcodeEvent als Event deklariert ist.
    Poste mal den C#-Code.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Der schaut so aus:

    C#-Quellcode

    1. static CCoreScannerClass cCoreScannerClass;
    2. public static void setUpScanner()
    3. {
    4. try
    5. {
    6. //Instantiate CoreScanner Class
    7. cCoreScannerClass = new CCoreScannerClass();
    8. //Call Open API
    9. short[] scannerTypes = new short[1];//Scanner Types you are interested in
    10. scannerTypes[0] = 1; // 1 for all scanner types
    11. short numberOfScannerTypes = 1; // Size of the scannerTypes array
    12. int status; // Extended API return code
    13. cCoreScannerClass.Open(0, scannerTypes, numberOfScannerTypes, out status);
    14. // Subscribe for barcode events in cCoreScannerClass
    15. cCoreScannerClass.BarcodeEvent += new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
    16. // Let's subscribe for events
    17. int opcode = 1001; // Method for Subscribe events
    18. string outXML; // XML Output
    19. string inXML = "<inArgs>" +
    20. "<cmdArgs>" +
    21. "<arg-int>1</arg-int>" + // Number of events you want to subscribe
    22. "<arg-int>1</arg-int>" + // Comma separated event IDs
    23. "</cmdArgs>" +
    24. "</inArgs>";
    25. cCoreScannerClass.ExecCommand(opcode, ref inXML, out outXML, out status);
    26. Console.WriteLine(outXML);
    27. }
    28. catch (Exception exp)
    29. {
    30. Console.WriteLine("Something wrong please check... " + exp.Message);
    31. }
    32. }
    33. static void OnBarcodeEvent(short eventType, ref string pscanData)
    34. {
    35. string barcode = pscanData;
    36. Console.WriteLine("Code:" + barcode);
    37. //this.Invoke((MethodInvoker)delegate { textBox1.Text = barcode; });
    38. }
    Option strict = on

    If it's stupid and it works it ain't stupid.
    @Nils_Kr Ich sehe da ein Wort, in dem kommt die Zeichenfolge "Event" vor, nur hat das nix mit einem .NET-Event zu tun. ;(
    Wenn Du Herr über diese Quellen bist, dann implementiere Dir doch ein richtiges Event, das kommt dann auch in VB.NET an.
    Hast Du beide Projekte in einer Projektmappe und dem VB-Projekt das C#-Projekt als Verweis hinzugefügt (das Projekt, nicht aber eine DLL)?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Diese CoreScannerLibrary ist nicht von mir und ich kenne den Quelltext leider auch nicht.

    RodFromGermany schrieb:


    Hast Du beide Projekte in einer Projektmappe und dem VB-Projekt das C#-Projekt als Verweis hinzugefügt (das Projekt, nicht aber eine DLL)?


    Genau so hab ich es gemacht. Von VB nach C# kann ich auch problemlos Funktionen aufrufen. Das Problem ist, dass ich die andere Richtung ebenfalls benötige. Aber es lässt sich nicht gleichzeitig eine Referenz in die andere Richtung setzen und daher kann ich keine VB-Funktionen in C# aufrufen.

    Ich habe übrigens ein Großteil der Funktionen der CoreScannerLibrary (die ist von Zebra/Motorola) auch in VB.Net zum laufen bekommen. Einzig diese Zeile cCoreScannerClass.BarcodeEvent += New _ICoreScannerEvents_BarcodeEventEventHandler(dosth); bekomme ich nicht übersetzt. Würde die gehen, könnte ich mir die C#-Klasse sparen. Telerik gibt nur eine Fehlermeldung und AddHandler cCoreScannerClass.BarcodeEvent, New _ICoreScannerEvents_BarcodeEventEventHandler(AddressOf doSth) oder AddHandler cCoreScannerClass.BarcodeEvent, AddressOf doSth wird zwar vom Compiler akzeptiert, aber es passiert nichts.

    Der totale Pfusch wäre per Timer von VB permanent nach geänderten Werten zu fragen (alle 100ms oder so). Aber das wäre die absolute Notlösung.
    Option strict = on

    If it's stupid and it works it ain't stupid.

    Nils_Kr schrieb:

    wird zwar vom Compiler akzeptiert, aber es passiert nichts.
    na, dann mach da weiter - dassis nämlich der richtige Weg.
    Das nichts passiert, liegt wohl an doSth. Zeigst du uns mal den Code von doSth()?

    Die c# - Klasse einzusparen lege ich dir sehr ans Herz. IMO keine gute Idee, sich neue Klassen auszudenken, weil man c#-code nicht nach vb.net übersetzt bekommt.

    Nils_Kr schrieb:

    Aber es lässt sich nicht gleichzeitig eine Referenz in die andere Richtung setzen
    Doch, per Event oder Delegate.
    Wie gesagt, die Buchstabenfolge "Event" hat leider nix mit Events zu tun, also funktioniert der Event-Zuweisungs-Formalismus nicht.
    Allerdings sieht das aus wie ein Delegate, wovon Events ein Spezialfall sind.
    Schau mal hier rein:
    docs.microsoft.com/de-de/dotne…gramming-guide/delegates/
    docs.microsoft.com/de-de/dotne…guage-features/delegates/
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    na, dann mach da weiter - dassis nämlich der richtige Weg.


    Ich bin nochmal meinen VB.Code durchgegangen und habe einen Fehler im Befehl gefunden, der an den Scanner geschickt wird. Jetzt funktioniert alles. Die Zeile ​AddHandler cCoreScannerClass.BarcodeEvent, New _ICoreScannerEvents_BarcodeEventEventHandler(AddressOf doSth) ist wider Erwaten tatsächlich korrekt. Folglich kann ich mir das C#-Konstrukt komplett sparen.

    Trotzdem werde ich mir die Links von @RodFromGermany durchlesen, wenn ich nochmal auf ein ähnliches Problem stoße, wäre es nämlich gut eine Lösung parat zu haben.

    Danke euch beiden!
    Option strict = on

    If it's stupid and it works it ain't stupid.