让WebBrowser控件在控制台应用程序中工作?

soo*_*ise 11 .net c# console-application webbrowser-control

我有一个能够通过WebBrowser对象打印HTML的打印机类.我希望能够从控制台应用程序打印,但是当我的打印机类尝试创建WebBrowser对象时出现错误:

WebBrowser browser = new WebBrowser();
Run Code Online (Sandbox Code Playgroud)

错误:

ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot 
be instantiated because the current thread is not in a 
single-threaded apartment.  
Run Code Online (Sandbox Code Playgroud)

我尝试将对System.Windows.Forms的引用添加到我的控制台应用程序中,但这不起作用.我对这里发生的事情一无所知,但我很感激你的帮助.

Sas*_*nyi 20

将STAThread属性添加到main方法.

[STAThread]
public static Main()
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

更新:在这里您应该使用创建浏览器的线程

thread.SetApartmentState(ApartmentState.STA);
Run Code Online (Sandbox Code Playgroud)

更新2:

如果每个应用一个线程:

Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
Run Code Online (Sandbox Code Playgroud)


Han*_*ant 9

控制台模式应用程序和WebBrowser是水和火.您需要遵循单线程单元合同,以便线程使用WebBrowser:

  • 必须是STA,如果您创建一个线程,请在Main()或Thread.SetApartmentState()上使用[STAThread].
  • 必须在Winforms或WPF中提供消息循环,Application.Run().

第二个要求对于WebBrowser来说是一个很难的要求,如果你不使用它,它将不会触发它的事件.检查此答案以获取用于创建运行WB的线程的代码.基于Winforms或WPF的GUI应用程序将始终使其主线程适合使用WB.