Получение контроля WebBrowser для работы в консольном приложении? - PullRequest
11 голосов
/ 02 апреля 2011

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

Ответы [ 2 ]

20 голосов
/ 02 апреля 2011

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

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

Обновление: Вот что вы должны сделать с темой, где создается браузер

thread.SetApartmentState(ApartmentState.STA);

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

Если по одному потоку на приложение:

Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
9 голосов
/ 02 апреля 2011

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

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

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

...