我从C#windows服务调用WatiN.当我调用WatiN时,它会抛出以下异常.CurrentThread需要将它的ApartmentState设置为ApartmentState.STA才能自动化Internet Explorer
我尝试启动一个线程并通过设置公寓状态
mythread.SetApartmentState(ApartmentState.STA)
Run Code Online (Sandbox Code Playgroud)
但这导致了另一个错误
无法计算表达式,因为代码已优化或本机帧位于调用堆栈之上.
我还尝试在Service入口点添加一个属性.
static class Program
{
[STAThread]
static void Main()
{
...
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
Pet*_*gan 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>
Run Code Online (Sandbox Code Playgroud)
在MbUnit中,修改您的TestFixture属性,如下所示:
[TestFixture(ApartmentState = ApartmentState.STA)]
Run Code Online (Sandbox Code Playgroud)
HTH,皮特.
哈 - 它实际上在文档中.卫生署! http://watin.org/documentation/sta-apartmentstate/
这不是错误,它只是来自调试器的诊断.它告诉你它不能给你关于你在观察窗口放置的任何内容的调试信息.这与在Release配置中编译的代码相同,JIT编译器优化机器代码并且通常将局部变量放入CPU寄存器中.使调试器无法使用它们的值,它不够聪明,无法确定使用了哪个寄存器.当调用堆栈中存在非托管代码时,它偶尔也会出现在Debug版本中.对于WebBrowser而言,这种情况并不罕见,有一大块非托管代码可以使其工作.
FWIW,只是将线程的公寓状态切换到STA是不够的.该线程还必须泵送Windows消息循环,以使单线程单元正常运行.如果不这样做,您将看到对像WebBrowser这样的STA对象的操作将会死锁.例如,导航到站点时,您永远不会获得DocumentCompleted事件.运行消息循环需要在WF应用程序中调用Application.Run()或Form.ShowDialog().
| 归档时间: |
|
| 查看次数: |
19044 次 |
| 最近记录: |