ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

single thread apartment (STA)ってなんじゃらほい

C#ドラッグアンドドロップするプログラムを書いてたら、こんなエラーが出た。

System.InvalidOperationException: DragDrop registration did not succeed. ---> System.Threading.ThreadStateException: Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it.
   at System.Windows.Forms.Control.SetAcceptDrops(Boolean accept)
   --- End of inner exception stack trace ---
   at System.Windows.Forms.Control.SetAcceptDrops(Boolean accept)
   at System.Windows.Forms.Control.OnHandleCreated(EventArgs e)
   at System.Windows.Forms.Form.OnHandleCreated(EventArgs e)
   at System.Windows.Forms.Control.WmCreate(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ContainerControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WmCreate(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

STAThread - なんにも考えていません -CROSSBONE
によると、Windows FormsアプリはSTAにするものなのだそうだ。(そうなの?)


なので、Mainに[STAThread]を付けたら無事動きました。

あとどうでもいいけど、
csc.exeのオプションに/target:winexeって付けないと、
コマンドプロンプトが起動した上に、ウインドウが上がってくるという気持ち悪い動きになるらしい。
今後気をつけよう。