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
|