让WebBrowser控件在控制台应用程序中工作?
问题描述:
我有一个能够通过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到我的控制台应用程序,但没有奏效。我对这里发生的事情一无所知,但我会很感激这个帮助。
答
将STAThread属性添加到您的主要方法。
[STAThread]
public static Main()
{
...
}
更新:在这里,你应该在其中创建浏览器线程做什么
thread.SetApartmentState(ApartmentState.STA);
更新2:
如果每个应用程序有一个线程:
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
答
控制台模式应用程序和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
如果仍然感兴趣,请在[此实现]上有一个循环(http://stackoverflow.com/a/19718530/1768303)。 – Noseratio 2013-10-31 23:52:12