我从C#windows服务调用WatiN。当我调用WatiN时,它会抛出以下异常。 CurrentThread需要将它的ApartmentState设置为ApartmentState.STA才能自动化Internet Explorer
我尝试通过
启动一个线程并设置公寓状态mythread.SetApartmentState(ApartmentState.STA)
但这导致了另一个错误
无法评估表达式,因为代码已优化或本机框架位于调用堆栈之上。
我也尝试在Service入口点添加一个属性。
static class Program
{
[STAThread]
static void Main()
{
...
有什么想法吗?
答案 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?