c# - WatiN: el CurrentThread necesita tener su ApartmentState configurado en ApartmentState.STA para poder automatizar Internet Explorer
service (3)
El atributo que solía superar este error es: [TestFixture, RequiereSTA]
Según la respuesta de adrianbanks en: ¿Cómo ejecutar pruebas unitarias en el modo STAThread?
Estoy llamando a WatiN desde un servicio de ventanas de C #. Cuando invoco WatiN lanza la siguiente excepción. El CurrentThread necesita tener su ApartmentState configurado en ApartmentState.STA para poder automatizar Internet Explorer
He intentado iniciar un hilo y establecer el estado del apartamento a través de
mythread.SetApartmentState(ApartmentState.STA)
pero eso dio lugar a otro error
No se puede evaluar la expresión porque el código está optimizado o un marco nativo está en la parte superior de la pila de llamadas.
También intenté agregar un atributo al punto de entrada del servicio.
static class Program
{
[STAThread]
static void Main()
{
...
¿Algunas ideas?
Eso no es un error, es solo un diagnóstico del depurador. Le está diciendo que no puede darle información de depuración sobre lo que ponga en la ventana de vigilancia. Eso es común con el código que se compila en la configuración de la versión, el compilador JIT optimiza el código de la máquina y comúnmente coloca variables locales en los registros de la CPU. Al hacer que su valor no esté disponible para el depurador, no es lo suficientemente inteligente como para averiguar qué registro se utilizó. Ocasionalmente ocurre también en la versión de depuración cuando hay un código no administrado en la pila de llamadas. Lo que no es infrecuente para WebBrowser, hay una gran cantidad de código no administrado que lo hace funcionar.
FWIW, simplemente cambiar el estado del apartamento del hilo a STA no es suficiente. El subproceso también debe bombear un bucle de mensajes de Windows para que un apartamento de un solo subproceso funcione correctamente. Si no lo hace, verá que las operaciones en objetos STA como WebBrowser se interbloquearán. Por ejemplo, nunca obtendrá el evento DocumentCompleted cuando navegue a un sitio. La ejecución de un bucle de mensajes requiere llamar a Application.Run () o Form.ShowDialog () en una aplicación WF.
Sé que Benjamin ya publicó una respuesta de ''trabajo'', pero pensé que agregaría un par de cosas que experimenté cuando recibí este error al intentar ejecutar las pruebas de WatiN: para NUnit, debe agregar algo como esto a su app.config para las pruebas:
<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>
En MbUnit, modifique su atributo TestFixture de esta manera:
[TestFixture(ApartmentState = ApartmentState.STA)]
HTH, Pete.
Ha - en realidad está en la documentación. Doh! http://watin.org/documentation/sta-apartmentstate/