Marshallerfehler ?!

xlon

Mitglied
Hallo zusammen,

ich habe ein Tool zum SMS versenden über UMTS geschrieben, dies funktioniert soweit alles. Leider bekomme ich (aber nur ab und zu) eine Fehlermeldung:

Code:
Die Laufzeit hat einen schwerwiegenden Fehler entdeckt. Fehleradresse: "0x65317aed" in Thread "0x12a8". Fehlercode: 0xc0000005. Bei diesem Fehler könnte es sich um ein Problem in der CLR oder in den unsicheren oder nicht verifizierbaren Teilen des Benutzercodes handeln. Übliche Ursachen dieses Bugs sind Marshallerfehler für COM-Interop oder PInvoke, die den Stapel beschädigen können.

Was habe ich gemacht?

Ich habe mir eine Klasse geschrieben, dafür benötigte ich 4 DLL Dateien, die ich mit Projekt->Verweis hinzufügen->Durchsuchen ausgewählt und peer using eingebunden habe

Code:
using ...
using GsmComm.GsmCommunication;
using GsmComm.PduConverter;

	class SMS
    {
        SmsSubmitPdu _pdu;
        GsmCommMain _comm;
        DataTable _dt = new DataTable();

        public SMS()
        {
            

           
                    _comm = new GsmCommMain(3);
                    _comm.Open();
                  
        }

		public bool SMSleseninDatagrid(DataGridView dgv, PhoneMessageStatus status)
        {
            try
            {
                string storage = PhoneStorageType.Phone;


                DataTable t = new DataTable();

                DataColumn column;
                DataRow row;

                column = new DataColumn();
                column.ColumnName = "Absender";
                t.Columns.Add(column);

                column = new DataColumn();
                column.ColumnName = "Uhrzeit";
                t.Columns.Add(column);

                column = new DataColumn();
                column.ColumnName = "Nachricht";
                t.Columns.Add(column);

                DataSet dataSet = new DataSet();

                dataSet.Tables.Add(t);


                if (status == PhoneMessageStatus.All)
                {
                    DecodedShortMessage[] messages = _comm.ReadMessages(PhoneMessageStatus.ReceivedRead, storage.ToString());


                    foreach (DecodedShortMessage message in messages)
                    {
                        DataRow dr = _dt.NewRow();
                        SmsDeliverPdu data = (SmsDeliverPdu)message.Data;

                        row = t.NewRow();
                        row[0] = data.OriginatingAddress.ToString();
                        row[1] = data.SCTimestamp.ToDateTime();
                        row[2] = data.UserDataText;
                        _dt.Rows.Add(dr);
                        t.Rows.Add(row);
                    }
                    DecodedShortMessage[] messages2 = _comm.ReadMessages(PhoneMessageStatus.ReceivedUnread, storage.ToString());


                    foreach (DecodedShortMessage message in messages2)
                    {
                        DataRow dr = _dt.NewRow();
                        SmsDeliverPdu data = (SmsDeliverPdu)message.Data;

                        row = t.NewRow();
                        row[0] = data.OriginatingAddress.ToString();
                        row[1] = data.SCTimestamp.ToDateTime();
                        row[2] = data.UserDataText;
                        _dt.Rows.Add(dr);
                        t.Rows.Add(row);
                        SystemSounds.Asterisk.Play();
                    }
                }
                dgv.DataSource = dataSet.Tables[0];
                dgv.Sort(dgv.Columns[1], ListSortDirection.Descending);


                dgv.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                dgv.Columns[1].Width = 170;
                dgv.Columns[0].Width = 150;
                dgv.Columns[1].ReadOnly = true;
                dgv.Columns[0].ReadOnly = true;

                return true;

            }
            catch
            {
                return false;
            }
        }
    }

Ich kann x mal die Methode public bool SMSleseninDatagrid(DataGridView dgv, PhoneMessageStatus status) ausführen und beim x+1 gibt er die Fehlermeldung und zwar an dieser Stelle:
Code:
DecodedShortMessage[] messages = _comm.ReadMessages(PhoneMessageStatus.ReceivedRead, storage.ToString());

Vielen Dank für eure Hilfe
 
Hast du die Methode "ReadMessages" geschrieben? Aus dem Hinweis auf das Marshalling schließe ich, dass noch Nicht-C#-DLLs verwendet werden. Ich vermute, dass der Fehler beim Aufruf dieser externen DLLs liegt. Woher hast du "GsmComm"?
 
Hallo,
erstmal vielen Dank das du mir geantwortet hast,

die Methode ReadMessages habe ich nicht selbst geschrieben, sie stammt von der Klasse GsmCommMain...

GsmComm kommt von der DLL:
Code:
GSMCommunication.dll

außerdem wird noch
Code:
PDUConverter.dll

verwendet.

Code:
GSMCommShared.dll und
RS232.dll
sind meines erachtens nicht notwendig.

Ich hoffe du kannst mir weiter helfen.

Viele Grüße
 
Alles klar,
der Fehler liegt dann in der DLL?
Das weiß ich nicht. Ich vermute es.

Wenn du selbst nie Marshalling/PInvoke betreibts und immer nur reinen C#-Code verwendest und auch nur sicheren Code schreibst (also nie unsafe verwendest), dann wird der Fehler in der DLL liegen. Ich sehe jedenfalls keinen anderen Weg, wie du sonst eine solche Fehlermeldung erzeugen könntest (ich gehe mal davon aus, dass deine Hardware, insbesondere RAM, frei von Schäden ist).

Versuche ein Minimalprojekt zu erstellen, das den Fehler häufig reproduziert und schicke das an den Hersteller, um ihn bei der Fehlersuche zu unterstützen.
 
Zurück