2009-12-23 7 views
25

Llamo a WatiN desde un servicio de Windows C#. Cuando invoco WatiN arroja la siguiente excepción. El CurrentThread necesita tener que está establecido ApartmentState a ApartmentState.STA para poder automatizar Internet ExplorerWatiN: The CurrentThread necesita tener su ApartmentState configurado en ApartmentState.STA para poder automatizar Internet Explorer

He tratado de poner en marcha un hilo y establecer el estado de apartamento a través de

mythread.SetApartmentState(ApartmentState.STA) 

pero que termina en un 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 al Servicio.

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

¿Alguna idea?

+2

No entiendo el segundo error (en negrita) . ¿Puedes mostrar más código? Tuve un requisito similar y crear un nuevo hilo, establecer ApartmentState y llamar a .Start() seguido de .Join(), básicamente haciendo solo las cosas relacionadas con STA allí, funcionó bien para mí. –

+0

Para aclarar más.Creé un hilo dentro de mi servicio y SetApartmentState (ApartmentState.STA) que invoca mi código WATiN. Eso arrojó la siguiente excepción. – Jonathan

+0

¡Hola Benjamin! De hecho, estás en lo cierto! No me estaba uniendo a mi hilo. Deberías haber publicado como la respuesta;) – Jonathan

Respuesta

18

Sé que Benjamin ya publicó una respuesta 'operativa', pero pensé que agregaría un par de cosas que he experimentado cuando tengo este error al intentar ejecutar pruebas WatiN: Para NUnit, debería añadir 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, modificar TestFixture atributo de la siguiente manera:

[TestFixture(ApartmentState = ApartmentState.STA)] 

HTH, Pete.

Ha - en realidad está en la documentación. Doh! http://watin.org/documentation/sta-apartmentstate/

+3

Esta es la respuesta más útil cuando solo quiere obtener WatiN con IE para trabajar en su proyecto de prueba. Gracias, Pete! – Oliver

+0

¡Gracias, funcionó para mí! –

+0

para NUnit 2.5 y esto no funcionó, esta respuesta funcionó: http://stackoverflow.com/a/5293312/173817 – toni

8

Eso no es un error, es solo un diagnóstico del depurador. Te está diciendo que no puede darte información de depuración en lo que coloques en la ventana del reloj. Eso es común con el código que se compila en la configuración de Release, el compilador JIT optimiza el código de la máquina y comúnmente coloca las 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ó. Ocurre ocasionalmente en la versión Debug también cuando hay un código no administrado en la pila de llamadas. Lo cual no es raro 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 hilo también debe bombear un bucle de mensaje de Windows para hacer que un apartamento de un solo subproceso funcione correctamente. Si no lo hace, verá que las operaciones en objetos STA como WebBrowser se estancarán. Por ejemplo, nunca obtendrá el evento DocumentCompleted cuando navegue a un sitio. Ejecutar un ciclo de mensajes requiere llamar a Application.Run() o Form.ShowDialog() en una aplicación WF.

+0

¡Eso tiene mucho sentido! – Jonathan

+0

Muchas gracias. ¡Unirse al hilo ayudó a resolver el problema! – Jonathan

Cuestiones relacionadas