c#: ObjectDisposedException in SuspendLayout - wie den Übeltäter finden?

OP #3162943
Ich amüsiere mich jetzt schon den zweiten Tag mit dem Problem und komme 
auf keinen grünen Zweig:

- Ich entsorge ein selbstgestricktes, kleines Control - das geht
  beliebig oft gut:
1
   editPanel.Controls.Remove(a.Control);
2
   a.Control.Dispose();
3
   a.Control = null;
  a.Control.Dispose setzt eine Referenz auf a im Control auf null:
1
    protected override void Dispose(bool disposing) {
2
       _aspect = null;               // Zeigt auf a
3
       <es folgt der übliche, generierte Dispose-Code>
4
    }
- Dann verlasse ich den von Form abgeleiteten Dialog und entsorge
  ihn mit Dispose aus dem Hauptdialog heraus.
- Dann erzeuge ich den Dialog neu und wiederhole die Übung
  Nach dem ersten Control-Löschen bekomme ich ein
1
   ObjectDisposedException in SuspendLayout
  bevor der Fensterinhalt neu angezeigt werden soll, direkt nach
  der Löschoperation.
  Wenn ich die Löschoperation(en) nicht mache, tritt der Fehler in
  der Anzeigeroutine nicht auf.

Bei beiden Dialogen, die im Programm vorkommen und in meinem Control in 
die Dispose-Routinen sind Trace-Ausgaben eingebaut. Ebenso in den 
Konstruktor des Controls - die Ausgaben zeigen keine Auffälligkeiten. 
(Der Haupdialog läuft dabei durch, der zweite wird vom ersten geöffnet.)

Wie kann man herausfinden, welches Objekt der Übeltäter ist, wenn man 
keine Quellen von dem .net-Zeugs hat?

---------

Nachtrag:
Die Komponente ObjectName im Exception-Objekt ist "".
Der Stack-Eintrag zum Absturz lautet:
1
System.Drawing.dll!Microsoft.AGL.Common.MISC.HandleAr(
2
  Microsoft.AGL.Common.PAL_ERROR ar = InvalidHandle) + 0x5c bytes
OP #3163103
Des Rätsels Lösung:

Ich hatte einen static delegate in der Control-Klasse beim ersten Aufruf 
des zweiten Dialogs initialisiert und dann nicht mehr. Der Delegate 
zeigte auf eine Methode im zweiten Dialog.

Dann wurde der Dialog mit Dispose entsort, aber der Delegate blieb 
unverändert.

Das ist fatal, weil im Delegate neben der Methode auch der this-Zeiger 
auf das Objekt steckt, zu dem die Methode gehört - in dem Fall also die 
erste Instanz des zweiten Dialogs.

Mit der zweiten Instanz dieses Dialogs nahm das Verhängnis seinen Lauf: 
der Delegate-Aufruf arbeitete auf der (entsorgten) ersten Instanz des 
Dialoges...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.