2009-12-23 1 views
25

나는 C# Windows 서비스에서 WatiN을 호출합니다. WatiN을 호출하면 다음과 같은 예외가 발생합니다. CurrentThread ApartmentState 스레드를 시작하고WatiN : CurrentThread가 ApartmentState를 ApartmentState.STA로 설정하여 Internet Explorer를 자동화 할 수 있어야합니다.

mythread.SetApartmentState(ApartmentState.STA) 

를 통해 아파트 상태를 설정 내가 시도

을 Internet Explorer를 자동화 할 수 있도록 ApartmentState.STA로 설정되어 있어야하지만 다른 오류

결과

코드가 최적화되었거나 네이티브 프레임이 호출 스택 위에 있기 때문에 표현식을 평가할 수 없습니다.

또한 서비스 엔트리 포인트에 속성을 추가하려고 시도했습니다.

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

아이디어가 있으십니까?

+2

두 번째 (굵게) 오류 . 더 많은 코드를 보여줄 수 있습니까? 비슷한 요구 사항을 가지고 있고 새로운 스레드를 만들고 ApartmentState를 설정하고 .Start()를 호출 한 다음 .Join() - 본질적으로 STA 바인딩 된 항목 만 수행하는 것은 저에게 잘 맞았습니다. –

+0

더 자세히 설명합니다.내 WATiN 코드를 호출하는 내 서비스 및 SetApartmentState (ApartmentState.STA) 내에서 스레드를 만들었습니다. 다음 예외가 발생했습니다. – Jonathan

+0

안녕하세요 Benjamin! 실제로 당신은 정확합니다! 내 스레드에 합류하지 못했습니다. 답으로 게시해야합니다;) – Jonathan

답변

18

Benjamin 's는 이미 '작동중인'답변을 게시했지만 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/

+3

이것은 테스트 프로젝트에서 IE와 함께 WatiN을 사용하려는 경우 가장 유용한 답변입니다. 고마워, 피트! – Oliver

+0

고마워, 그것은 나를 위해 일했다! NUnit 2.5에 대한 –

+0

이상이 나를 위해 작동하지 않았다,이 대답 일했다 : http://stackoverflow.com/a/5293312/173817 – toni

8

이것은 오류가 아니며 디버거의 진단 정보 일뿐입니다. 시계 창에 넣은 내용에 디버그 정보를 줄 수는 없다는 것을 알려줍니다. 릴리스 구성에서 컴파일되는 코드는 일반적으로 JIT 컴파일러가 기계 코드를 최적화하고 일반적으로 로컬 변수를 CPU 레지스터에 넣습니다. 디버거에서 값을 사용할 수 없도록 만들면 어떤 레지스터가 사용되었는지 파악하는 것이 현명하지 않습니다. 호출 스택에 관리되지 않는 코드가있는 경우 디버그 릴리스에서도 가끔 발생합니다. WebBrowser에는 드문 일이 아니지만 매우 많은 관리되지 않는 코드가 있습니다.

FWIW, 단지 스레드의 아파트 상태를 STA로 전환하는 것만으로는 충분하지 않습니다. 또한 스레드는 단일 스레드 아파트가 제대로 작동하도록 Windows 메시지 루프를 펌프해야합니다. 그렇지 않으면 WebBrowser와 같은 STA 개체의 작업이 교착 상태가됩니다. 예를 들어, 사이트로 이동할 때 DocumentCompleted 이벤트를 얻지 못할 것입니다. 메시지 루프를 실행하려면 WF 응용 프로그램에서 Application.Run() 또는 Form.ShowDialog()를 호출해야합니다.

+0

그건 의미가 있습니다! – Jonathan

+0

대단히 감사합니다. 대화 목록에 참여하면 문제를 해결하는 데 도움이되었습니다. – Jonathan

관련 문제