Получение управления WebBrowser для работы в консольном приложении?

У меня есть класс принтера, который способен печатать HTML через объект WebBrowser. Я хочу, чтобы иметь возможность печатать из консольного приложения, но я получаю сообщение об ошибке, когда мой класс принтера пытается создать объект 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 в консольное приложение, но это не сработало. Я не имею ни малейшего представления о том, что происходит здесь, но я был бы признателен за помощь.

Ответ 1

Добавьте атрибут STAThread к вашему основному методу.

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

Обновление:. Что вам нужно делать с потоком, в котором создается браузер?

thread.SetApartmentState(ApartmentState.STA);

Обновление 2:

Если один поток для каждого приложения:

Thread.CurrentThread.SetApartmentState(ApartmentState.STA);

Ответ 2

Приложение в режиме консоли и WebBrowser - это вода и огонь. Вы должны следовать однопоточному договору квартиры для потока, чтобы использовать WebBrowser:

  • должен быть STA, используйте [STAThread] в Main() или Thread.SetApartmentState(), если вы создаете поток.
  • должен перекачать контур сообщения, Application.Run(), доступный в Winforms или WPF.

Второе требование является сложным для WebBrowser, оно не будет запускать его события, если вы его не используете. Проверьте этот ответ на код для создания потока, который запускает WB. Приложение GUI, основанное на Winforms или WPF, всегда будет иметь свой основной поток, уже подходящий для использования WB.