非常に複雑なアプリケーションを簡略化してこのサンプルプログラムを作成しました。同じバイナリ[.exe]は、起動時に一部のコンピュータでNULLポインタ例外をスローします。だから、Windows Formsフォームを適切に構築する方法を知りたい。Windowsフォームアプリケーションを正しく初期化する方法
Form1_SizeChanged
メソッドは、InitializeComponents()
の最後の文であるthis.ResumeLayout(false)
メソッドの結果です。私はそれをシミュレートすることを知らないので、私はちょうどこのテストプログラムのためにサイズを変更しました。
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");
}
}
Form1
が適切に構築されていない限り、私の理解によると、Form1_SizeChanged
が呼ばれるべきではありません。このシナリオでは、Windowsフォームのイベントアーキテクチャはどのように機能するのか、
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:
スタックトレースからの通知:Form1_sizeChangedはInitializeComponents()から呼び出されます。これは起こるべきではないと思います。 Form1_sizeChangedはForm1クラスのインスタンスメソッドであり、Form1が構築される前に呼び出されるべきではありません。 .NET環境がこのイベントを処理したい場合、Form1が適切に構築されるまで待機する必要があります。
この例外はどこにスローされますか?どのマシン?スタックトレースはありますか? – Oded
@Oded:スタックトレースが質問に追加されました。 –