Подтвердить что ты не робот

WatiN: The CurrentThread должен иметь его, чтобы ApartmentState установил ApartmentState.STA, чтобы иметь возможность автоматизировать Internet Explorer

Я вызываю WatiN из службы Windows С#. Когда я вызываю WatiN, это вызывает следующее исключение. Для CurrentThread необходимо, чтобы ApartmentState установил на ApartmentState.STA, чтобы иметь возможность автоматизировать Internet Explorer

Я попытался запустить поток и установить состояние квартиры через

mythread.SetApartmentState(ApartmentState.STA)

но это привело к другой ошибке

Невозможно оценить выражение, потому что код оптимизирован или собственный кадр находится поверх стека вызовов.

Я также попытался добавить атрибут к точке входа службы.

static class Program
{
      [STAThread]
      static void Main()
      {
          ...

Любые идеи?

4b9b3361

Ответ 1

Я знаю, что Бенджамин уже опубликовал "рабочий" ответ, но я думал, что добавлю пару вещей, которые я испытал, когда у меня возникла эта ошибка при попытке выполнить тесты WatiN: Для NUnit вы должны добавить что-то вроде этого в свой app.config для тестов:

  <configSections>
    <sectionGroup name="NUnit">
      <section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/>
    </sectionGroup>
  </configSections>
  <NUnit>
    <TestRunner>
      <!-- WatiN can only host IE in STA mode -->
      <add key="ApartmentState" value="STA"/>
    </TestRunner>
  </NUnit>

В MbUnit измените атрибут TestFixture следующим образом:

[TestFixture(ApartmentState = ApartmentState.STA)] 

НТН, Пит.

Ha - это фактически в документации. Doh! http://watin.org/documentation/sta-apartmentstate/

Ответ 2

Это не ошибка, это просто диагностика от отладчика. Он говорит вам, что он не может дать вам отладочную информацию о том, что вы положили в окне просмотра. Что общего с кодом, который компилируется в конфигурации Release, компилятор JIT оптимизирует машинный код и обычно помещает локальные переменные в регистры CPU. Если их значение недоступно для отладчика, оно недостаточно умен, чтобы выяснить, какой регистр был использован. Иногда это происходит в выпуске Debug, а также когда неуправляемый код в стеке вызовов. Что не редкость для WebBrowser, там очень большой кусок неуправляемого кода, который заставляет его работать.

FWIW, просто переключить состояние квартиры нити на STA недостаточно. Поток также должен перекачать контур сообщения Windows, чтобы обеспечить работу однопоточной квартиры. Если вы этого не сделаете, вы увидите, что операции с объектами STA, такими как WebBrowser, будут заторможены. Например, вы никогда не получите событие DocumentCompleted при переходе на сайт. Запуск цикла сообщения требует вызова Application.Run() или Form.ShowDialog() в приложении WF.