2011-04-01 67 views
11

我有一个能够通过WebBrowser对象打印HTML的打印机类。我希望能够从一个控制台应用程序打印,但是当我的打印机类尝试创建一个web浏览器对象我得到一个错误:让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到我的控制台应用程序,但没有奏效。我对这里发生的事情一无所知,但我会很感激这个帮助。

+0

如果仍然感兴趣,请在[此实现]上有一个循环(http://stackoverflow.com/a/19718530/1768303)。 – Noseratio 2013-10-31 23:52:12

回答

19

将STAThread属性添加到您的主要方法。

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

更新:在这里,你应该在其中创建浏览器线程做什么

thread.SetApartmentState(ApartmentState.STA); 

更新2:

如果每个应用程序有一个线程:

Thread.CurrentThread.SetApartmentState(ApartmentState.STA); 
+0

我的程序使用[STAThread]运行,但实际上不打印。 – sooprise 2011-04-01 22:05:58

+0

但是你正在应用程序中创建另一个线程,对吧? – 2011-04-01 22:07:19

+0

我有一个全新的控制台应用程序,它在Main方法中从我的打印类中调用打印方法。我不认为我在我的控制台应用程序中创建任何其他线程。请让我知道如果这不能回答你的问题,谢谢。 – sooprise 2011-04-01 22:09:39

9

控制台模式应用程序和WebBrowser是水和火。您需要按照单线程公寓合同线程使用的web浏览器:

  • 必须是STA,在Main()方法或Thread.SetApartmentState()使用[STAThread]如果你创建一个线程。
  • 必须泵送一个消息循环,Application.Run()可用于Winforms或WPF。

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

+0

谢谢'Thread.SetApartmentState()'提示,在SSIS中我不能使用'[STAThread]',我花了很多时间寻找替代品! – Naigel 2015-07-30 12:12:09

相关问题