【问题标题】:Getting WebBrowser Control To Work In Console Application?让 WebBrowser 控件在控制台应用程序中工作?
【发布时间】:2011-07-28 00:26:47
【问题描述】:

我有一个能够通过 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 的引用,但这不起作用。我对这里发生的事情一无所知,但我将不胜感激。

【问题讨论】:

标签: c# .net webbrowser-control console-application


【解决方案1】:

将 STAThread 属性添加到您的 main 方法中。

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

更新:这里应该如何处理创建浏览器的线程

thread.SetApartmentState(ApartmentState.STA);

更新 2:

如果每个应用一个线程:

Thread.CurrentThread.SetApartmentState(ApartmentState.STA);

【讨论】:

  • 我的程序使用 [STAThread] 运行,但实际上并没有打印。
  • 我有一个全新的控制台应用程序,它在 Main 方法中从我的 print 类调用 print 方法。我认为我没有在我的控制台应用程序中创建任何其他线程。如果这不能回答您的问题,请告诉我。
  • 我不明白您如何将“therad”设置为当前线程?我的 WebBrowser 仅从主打印机类打开。到目前为止,我非常感谢您的帮助:)
【解决方案2】:

控制台模式应用程序和 WebBrowser 是水和火。您需要遵循单线程单元合约的线程才能使用 WebBrowser:

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

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

【讨论】:

  • 感谢 Thread.SetApartmentState() 的提示,在 SSIS 中我无法使用 [STAThread],我花了很多时间寻找替代方案!
猜你喜欢
  • 2021-11-14
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多