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って付けないと、
コマンドプロンプトが起動した上に、ウインドウが上がってくるという気持ち悪い動きになるらしい。
今後気をつけよう。