WatiN:CurrentThread需要将它的ApartmentState设置为ApartmentState.STA才能自动化Internet Explorer

时间:2009-12-23 11:51:13

标签: c# service watin

我从C#windows服务调用WatiN。当我调用WatiN时,它会抛出以下异常。 CurrentThread需要将它的ApartmentState设置为ApartmentState.STA才能自动化Internet Explorer

我尝试通过

启动一个线程并设置公寓状态
mythread.SetApartmentState(ApartmentState.STA)

但这导致了另一个错误

无法评估表达式,因为代码已优化或本机框架位于调用堆栈之上。

我也尝试在Service入口点添加一个属性。

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

有什么想法吗?

3 个答案:

答案 0 :(得分:18)

我知道Benjamin已经发布了一个“正常工作”的答案,但是当我尝试执行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)] 

HTH, 皮特。

哈 - 它实际上在文档中。卫生署! http://watin.org/documentation/sta-apartmentstate/

答案 1 :(得分:8)

这不是错误,它只是来自调试器的诊断。它告诉你它不能给你关于你在观察窗口放置的任何内容的调试信息。这与在Release配置中编译的代码相同,JIT编译器优化机器代码并通常将局部变量放入CPU寄存器中。使调试器无法使用它们的值,它不够聪明,无法确定使用了哪个寄存器。当调用堆栈中存在非托管代码时,它偶尔也会出现在Debug版本中。对于WebBrowser而言,这种情况并不罕见,有很大一部分非托管代码可以使它工作。

FWIW,只是将线程的公寓状态切换到STA是不够的。该线程还必须泵送Windows消息循环,以使单线程单元正常运行。如果不这样做,您将看到对像WebBrowser这样的STA对象的操作将会死锁。例如,导航到站点时,您永远不会获得DocumentCompleted事件。运行消息循环需要在WF应用程序中调用Application.Run()或Form.ShowDialog()。

答案 2 :(得分:3)

我过去常常看到这个错误的属性是:     [TestFixture,RequiresSTA]

根据adrianbanks的回答:How to run unit tests in STAThread mode?