web-dev-qa-db-ja.com

WebBrowserコントロールをコンソールアプリケーションで機能させるには?

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への参照をコンソールアプリケーションに追加しようとしましたが、機能しませんでした。ここで何が起こっているのか少しもわかりませんが、助けていただければ幸いです。

11
sooprise

MainメソッドにSTAThread属性を追加します。

[STAThread]
public static Main()
{
    ...
}

更新:ここでブラウザが作成されたスレッドで何をすべきか

thread.SetApartmentState(ApartmentState.STA);

更新2:

アプリごとに1つのスレッドの場合:

Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
20
Sasha Reminnyi

コンソールモードアプリとWebBrowserは水と火です。 WebBrowserを使用するには、スレッドのシングルスレッドアパートメントコントラクトに従う必要があります。

  • sTAである必要があります。スレッドを作成する場合は、Main()またはThread.SetApartmentState()で[STAThread]を使用してください。
  • winformsまたはWPFで使用可能なメッセージループApplication.Run()をポンプする必要があります。

2番目の要件は、WebBrowserにとって難しい要件です。使用しない場合、イベントは発生しません。 WBを実行するスレッドを作成するコードについて この回答 を確認してください。 WinformsまたはWPFに基づくGUIアプリには、常にWBの使用に適したメインスレッドがあります。

9
Hans Passant