WebBrowserオブジェクトを介してHTMLを印刷できるプリンタークラスがあります。コンソールアプリケーションから印刷できるようにしたいのですが、プリンタクラスがWebBrowserオブジェクトを作成しようとするとエラーが発生します。
WebBrowser browser = new WebBrowser();
エラー:
ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot
be instantiated because the current thread is not in a
single-threaded apartment.
System.Windows.Formsへの参照をコンソールアプリケーションに追加しようとしましたが、機能しませんでした。ここで何が起こっているのか少しもわかりませんが、助けていただければ幸いです。
MainメソッドにSTAThread属性を追加します。
[STAThread]
public static Main()
{
...
}
更新:ここでブラウザが作成されたスレッドで何をすべきか
thread.SetApartmentState(ApartmentState.STA);
更新2:
アプリごとに1つのスレッドの場合:
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
コンソールモードアプリとWebBrowserは水と火です。 WebBrowserを使用するには、スレッドのシングルスレッドアパートメントコントラクトに従う必要があります。
2番目の要件は、WebBrowserにとって難しい要件です。使用しない場合、イベントは発生しません。 WBを実行するスレッドを作成するコードについて この回答 を確認してください。 WinformsまたはWPFに基づくGUIアプリには、常にWBの使用に適したメインスレッドがあります。