C# EventHandler wird falsch aufgerufen?

-Rayz-

Lieutenant
Registriert
Okt. 2010
Beiträge
907
Hallo,

ich versuche gerade eine dll zu schreiben und diese dann in ein Programm einzubinden und zu nutzen. Ich habe hier einen Kartenleser welcher das Event triggern soll wenn eine Karte durchgezogen wird.

In der DLL gibt es die Klassen Initialisierung, COMPort und Settings. In meiner Form verweise ich auf die DLL und erstelle von der Klasse Initialisierung ein neues Objekt.

Also ich initialisiere den Port und abonniere ein Event.
Code:
Port.Received += new SerialDataReceivedEventHandler(sp_Received);

In der Funktion die dort aufgerufen wird verarbeite ich die Daten und schicke sie weiter zu meiner Event Klasse

Code:
private void sp_Received(object sender, SerialDataReceivedEventArgs e)
{
     ...
     rdt.OnReceived(send);
}

    public class Data
    {
        public event EventHandler<DataEvent> Received;

        public delegate void EventHandler(object sender, DataEvent e);
        public void OnReceived(byte[] Data)
        {
            if (DataReceived != null)
            {
                DataReceived(this, new DataEvent { bData = Data });
            }
        }
    }

    public class DataEvent : EventArgs
    {
        public byte[] bData { get; set; }
 
    }

Und in dieser Klasse ist auch mein (erstes) Problem. DataReceived ist null und wenn ich die If Anweisung wegnehme bekomme ich eine Fehlermeldung: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."} System.Exception {System.NullReferenceException}

Ist mein Aufruf falsch? Irgendetwas habe ich ja vergessen... muss ich es vorher irgendwie abonnieren? Hab mir schon paar Beispiele angesehen und versucht diese auf mein Projekt zu übertragen aber ich komme hier - noch- nicht weiter.

Schon einmal vielen Dank für die Hilfe.
 
Zuletzt bearbeitet:
Ich würde einfach mal darauf tippen, dass dein "rdata"-Objekt null ist.
 
kann eigentlich nicht sein...

Code:
    class COMPort
    {
        Settings setting = new Settings();
        SerialPort Port = new SerialPort();
        Data rdata = new Data();

...

     }

und die Klasse COMPort wird direkt bei der Initialisierung aufgerufen

Code:
    public class Initialisierung
    {     

        
        Settings settings = new Settings();
        Port port = new Port();
Ergänzung ()

Ich hab in meiner Form von wo aus ich die DLL aufrufe nun folgendes hinzugefügt:

Code:
        private void button1_Click(object sender, EventArgs e)
        {
            Data dataTest = new Data();
            dataTest.Received += new EventHandler<DataEvent>(this.Data);
                      
            blub.start();
}

Hat leider nichts gebracht...
 
Zuletzt bearbeitet:
Solange dass Objekt "rdata" in der COM-Port-Klasse ist, bringt dir das nicht viel wenn ich das richtig sehe.
Sry aber bei den Code-Ausschnitten blick ich nicht durch.
 
HA super!! Wollte gerade den Code übersichtlicher hier posten und dabei ist mir aufgefallen, dass ich hier init.start(dataTest); das Event übergebe aber dann NICHT weiterleite.

Code:
        public string start(Data dataEvent)
        {
            try
            {
                rdt = dataEvent;


}

nun ist rdata nicht mehr null :)

Daten werden wie gewünscht über die DLL nun an die Form geliefert.
DANKE :D

PS: Versuche beim nächsten Problem es irgendwie übersichtlicher zu gestalten.. ist gar nicht so einfach..
 
Zuletzt bearbeitet:
Zurück
Oben