Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WatiN:CurrentThread需要它';s将ApartmentState设置为ApartmentState.STA,以便能够自动化Internet Explorer_C#_Service_Watin - Fatal编程技术网

C# WatiN:CurrentThread需要它';s将ApartmentState设置为ApartmentState.STA,以便能够自动化Internet Explorer

C# WatiN:CurrentThread需要它';s将ApartmentState设置为ApartmentState.STA,以便能够自动化Internet Explorer,c#,service,watin,C#,Service,Watin,我是通过C#windows服务打电话给WatiN的。当我调用WatiN时,它抛出以下异常。CurrentThread需要将其ApartmentState设置为ApartmentState.STA才能自动执行Internet Explorer 我试着启动一个线程并通过 mythread.SetApartmentState(ApartmentState.STA) 但这导致了另一个错误 无法计算表达式,因为代码已优化或本机帧位于调用堆栈顶部。 我还尝试向服务入口点添加属性 static class

我是通过C#windows服务打电话给WatiN的。当我调用WatiN时,它抛出以下异常。CurrentThread需要将其ApartmentState设置为ApartmentState.STA才能自动执行Internet Explorer

我试着启动一个线程并通过

mythread.SetApartmentState(ApartmentState.STA)
但这导致了另一个错误

无法计算表达式,因为代码已优化或本机帧位于调用堆栈顶部。

我还尝试向服务入口点添加属性

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

有什么想法吗

这不是错误,只是调试器的诊断。它告诉你,它不能给你调试信息,无论你把什么在手表窗口。这在版本配置中编译的代码中很常见,JIT编译器优化机器代码,并通常将局部变量放入CPU寄存器中。如果调试器无法使用它们的值,那么就没有足够的智能来确定使用了哪个寄存器。当调用堆栈上有非托管代码时,这种情况偶尔也会发生在调试版本中。这对于WebBrowser来说并不少见,有大量的非托管代码使其工作


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

我知道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>
嗯,, 皮特

哈-它实际上在文档中。啊!

看到这个错误时,我习惯于忽略的属性是: [TestFixture,Requiremesta]


根据Adrianbank的回答:

我不理解第二个(粗体)错误。你能再给我看一些代码吗?我有一个类似的要求,创建一个新线程,设置ApartmentState并调用.Start(),然后调用.Join()——基本上只做STA绑定的东西——对我来说效果很好。为了进一步澄清。我在服务和SetApartmentState(ApartmentState.STA)中创建了一个线程,该线程调用我的WATiN代码。这引发了以下异常。嗨,本杰明!你确实是对的!我没有加入我的线程。您应该将其作为答案发布;)这很有道理!非常感谢。加入线程有助于解决问题!当你只想让WatiN和IE一起在你的测试项目中工作时,这是最有用的答案。谢谢你,皮特!对于NUnit 2.5及以上版本,这对我不起作用,这个答案有效:
[TestFixture(ApartmentState = ApartmentState.STA)]