回答:
これSTAThreadAttribute
は基本的に、WindowsメッセージポンプがCOMコンポーネントと通信するための要件です。コアWindowsフォームはCOMを使用しませんが、システムダイアログなどのOSの多くのコンポーネントがこのテクノロジーを使用します。
MSDNがその理由をもう少し詳しく説明します。
STAThreadAttributeは、アプリケーションのCOMスレッドモデルがシングルスレッドアパートメントであることを示します。この属性は、Windowsフォームを使用するアプリケーションのエントリポイントに存在する必要があります。省略した場合、Windowsコンポーネントが正しく動作しない可能性があります。属性が存在しない場合、アプリケーションはマルチスレッドアパートメントモデルを使用します。これはWindowsフォームではサポートされていません。
このブログ投稿(なぜSTAThreadが必要なのですか?)でも、要件が非常によく説明されています。スレッドモデルがCLRレベルでどのように機能するかについてさらに詳しく知りたい場合は、2004年6月(2009年4月)のこのMSDN Magazineの記事を参照してください。
シングルスレッドアパートメントモデルであることをコンパイラーに伝えます。これは悪意のあるCOMのことであり、STAとして実装されている描画にWin32を使用するため、通常はWindowsフォーム(GUI)に使用されます。複数のスレッドからのSTAモデルであるものを使用している場合、オブジェクトが破損します。
このため、別のスレッドからGuiを呼び出す必要があります(フォームのコーディングを行った場合)。
基本的には心配する必要はありません。WindowsGUIスレッドをSTAとしてマークする必要があることを受け入れてください。そうしないと、変なことが起こります。
STAThreadAttributeは、COMが必要な場合にシングルスレッドCOMアパートメントを使用するようにスレッドをマークします。デフォルトでは、.NETはCOMを初期化しません。COMオブジェクトまたはCOMコントロールが作成されたときや、ドラッグアンドドロップが必要になったときなど、COMが必要な場合にのみ、COMが初期化されます。これが発生すると、.NETは基になるCoInitializeEx関数を呼び出します。この関数は、スレッドをマルチスレッドまたはシングルスレッドのアパートメントに参加させるかどうかを示すフラグを取得します。
詳細はこちら(アーカイブ、2009年6月)
そして
[STAThread]
何ですか?