Wie richtig initialisiert eine Windows Forms-Anwendung

Ich geschrieben habe, dieses Muster-Programm - vereinfacht eine sehr komplexe Anwendung. Die gleiche Binär - [.exe] wird eine null-Zeiger-Ausnahme auf einigen Maschinen auf Start. Also, ich möchte wissen, wie man richtig bauen ein Windows Forms-Formular.

In unserer Anwendung die Form1_SizeChanged - Methode ist ein Ergebnis der this.ResumeLayout(false) Methode, die ist die Letzte Anweisung in InitializeComponents(). Ich weiß nicht, zu simulieren, so dass ich nur die Größe geändert, mich für diesen test Programm.

public partial class Form1 : Form
{
    public class Logger {
        public Logger() { }
        public void log(string str) {
            Console.WriteLine("logging - " + str);
        }
    }

    Logger logger = null;

    public Form1()
    {
        InitializeComponent();
        this.Size = new Size(200, 300);
        MyInitialize();
    }

    private void MyInitialize() {

        //Just that it takes some time.
        Console.WriteLine("MyInitialize -- Enter");
        for (int count = 0; count <5 ; count++){
            Console.WriteLine("Sleeping -- " + count);
            Thread.Sleep(1000);
        }
        logger = new Logger();
    }

    private void sleepingPill(int millisec) {
        Thread.Sleep(millisec);
    }

    private void Form1_SizeChanged(object sender, EventArgs e)
    {
        logger.log("Form1_SizeChanged -- Enter");
    }
}

Nach meinem Verständnis Form1_SizeChanged sollte nicht aufgerufen werden, es sei denn Form1 richtig aufgebaut ist. Kann jemand werfen etwas Licht auf, wie der Windows Forms-event-Architektur in diesem Szenario funktionieren?


Original Stack Trace: from our complex application
System.NullReferenceException was unhandled
  Message=Object reference not set to an instance of an object.
  Source=ABCD
  StackTrace:
       at ABCD.Form1.AppendToLog(String s)
       at ABCD.Form1.Form1_SizeChanged(Object sender, EventArgs e)
       at System.Windows.Forms.Control.OnSizeChanged(EventArgs e)
       at System.Windows.Forms.Control.UpdateBounds(Int32 x, Int32 y, Int32 width, Int32 height, Int32 clientWidth, Int32 clientHeight)
       at System.Windows.Forms.Control.UpdateBounds(Int32 x, Int32 y, Int32 width, Int32 height)
       at System.Windows.Forms.Control.SetBoundsCore(Int32 x, Int32 y, Int32 width, Int32 height, BoundsSpecified specified)
       at System.Windows.Forms.Form.SetBoundsCore(Int32 x, Int32 y, Int32 width, Int32 height, BoundsSpecified specified)
       at System.Windows.Forms.Control.ScaleControl(SizeF factor, BoundsSpecified specified)
       at System.Windows.Forms.ScrollableControl.ScaleControl(SizeF factor, BoundsSpecified specified)
       at System.Windows.Forms.Form.ScaleControl(SizeF factor, BoundsSpecified specified)
       at System.Windows.Forms.Control.ScaleControl(SizeF includedFactor, SizeF excludedFactor, Control requestingControl)
       at System.Windows.Forms.ContainerControl.Scale(SizeF includedFactor, SizeF excludedFactor, Control requestingControl)
       at System.Windows.Forms.ContainerControl.PerformAutoScale(Boolean includedBounds, Boolean excludedBounds)
       at System.Windows.Forms.ContainerControl.PerformNeededAutoScaleOnLayout()
       at System.Windows.Forms.ContainerControl.OnLayoutResuming(Boolean performLayout)
       at System.Windows.Forms.Control.ResumeLayout(Boolean performLayout)
       at ABCD.Form1.InitializeComponent()
       at ABCD.Form1..ctor()
       at ABCD.Program.Main()
  InnerException:

Hinweis aus dem stack trace: Form1_sizeChanged aufgerufen, die InitializeComponents () .., die ich denke, sollte das nicht passieren. Form1_sizeChanged ist eine Instanz-Methode der Form1-Klasse und sollte nicht aufgerufen werden, bevor die Form1 erstellt. Wenn die .NET-Umgebung Bearbeiten möchten dieses Ereignis, sollte es warten, bis Form1 richtig aufgebaut ist, sollte es nicht?

Wo ist diese Ausnahme wird geworfen? Was für Maschinen? Sie haben einen stack-trace?
Stack trace Hinzugefügt zu der Frage.

InformationsquelleAutor Karephul | 2011-02-10

Schreibe einen Kommentar