2009-12-23 8 views
25

स्वचालित करने में सक्षम होने के लिए ApartmentState.STA पर अपार्टमेंटस्टेट सेट करने की आवश्यकता है, मैं एक सी # विंडोज सेवा से WatiN को कॉल कर रहा हूं। जब मैं वातिन का आह्वान करता हूं तो यह निम्नलिखित अपवाद फेंकता है। CurrentThread यह ApartmentState ApartmentState.STA पर सेट है इंटरनेट एक्सप्लोरर स्वचालित करने के लिएWatiN: CurrentThread को InternetState

मैं कोशिश की है एक धागा शुरू और

mythread.SetApartmentState(ApartmentState.STA) 

के माध्यम से फ्लैट राज्य की स्थापना में सक्षम होना चाहिए की जरूरत है, लेकिन है कि एक और त्रुटि

में हुई

अभिव्यक्ति का मूल्यांकन करने में असमर्थ क्योंकि कोड अनुकूलित किया गया है या मूल फ्रेम कॉल स्टैक के शीर्ष पर है।

मैंने सेवा प्रविष्टि बिंदु में एक विशेषता जोड़ने का भी प्रयास किया।

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

कोई विचार?

+2

मुझे समझ नहीं आता दूसरा (बोल्ड) त्रुटि । क्या आप कुछ और कोड दिखा सकते हैं? मेरे पास एक समान आवश्यकता थी और अपार्टमेंटस्टेट को सेट करने और कॉल करने के लिए एक नया धागा बनाना था। टार्ट() के बाद। जॉइन() - अनिवार्य रूप से वहां केवल एसटीए बाध्य सामान कर रहा था - मेरे लिए ठीक काम किया। –

+0

आगे स्पष्टीकरण के लिए।मैंने अपनी सेवा और SetApartmentState (ApartmentState.STA) के भीतर एक थ्रेड बनाया जो मेरे WATIN कोड को आमंत्रित करता है। ने निम्नलिखित अपवाद को फेंक दिया। – Jonathan

+0

हाय बेंजामिन! वास्तव में आप सही हैं! मैं अपने धागे में शामिल नहीं था। आपको जवाब के रूप में पोस्ट करना चाहिए था;) – Jonathan

उत्तर

18

मुझे पता है कि बेंजामिन ने पहले से ही 'काम करने' का जवाब पोस्ट किया है, लेकिन मैंने सोचा था कि जब मैंने WATN परीक्षण निष्पादित करने का प्रयास करते समय मुझे यह त्रुटि मिली है तो मुझे कुछ चीजें मिलेंगी: 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

यह सबसे उपयोगी उत्तर है जब आप अपने परीक्षण प्रोजेक्ट में काम करने के लिए आईई के साथ WatiN प्राप्त करना चाहते हैं। धन्यवाद, पीट! – Oliver

+0

धन्यवाद, यह मेरे लिए काम किया! –

+0

NUnit 2.5 के लिए और ऊपर यह मेरे लिए काम नहीं किया, यह जवाब काम किया: http://stackoverflow.com/a/5293312/173817 – toni

8

यह कोई त्रुटि नहीं है, यह केवल डीबगर से नैदानिक ​​है। यह आपको बता रहा है कि यह आपको घड़ी विंडो में जो कुछ भी डालता है उस पर आपको डीबग जानकारी नहीं दे सकता है। कोड के साथ यह सामान्य है जो रिलीज कॉन्फ़िगरेशन में संकलित है, जेआईटी कंपाइलर मशीन कोड को अनुकूलित करता है और आमतौर पर सीपीयू रजिस्टरों में स्थानीय चर डालता है। डीबगर के लिए अपना मूल्य अनुपलब्ध बनाना, यह पता लगाने के लिए पर्याप्त स्मार्ट नहीं है कि पंजीकरण का उपयोग किस प्रकार किया गया था। कभी-कभी डीबग रिलीज में भी होता है जब कॉल स्टैक पर अप्रबंधित कोड होता है। जो WebBrowser के लिए असामान्य नहीं है, वहां अप्रबंधित कोड का एक बहुत बड़ा हिस्सा है जो इसे काम करता है।

एफडब्ल्यूआईडब्ल्यू, बस थ्रेड के अपार्टमेंट राज्य को एसटीए में स्विच करना पर्याप्त नहीं है। थ्रेड को एक सिंगल-थ्रेडेड अपार्टमेंट ठीक से काम करने के लिए एक विंडोज संदेश लूप भी पंप करना होगा। यदि आप नहीं करते हैं, तो आप देखेंगे कि एसटीए ऑब्जेक्ट्स जैसे वेबब्राउज़र पर ऑपरेशन डेडलॉक होगा। उदाहरण के लिए, जब आप किसी साइट पर नेविगेट करते हैं तो आपको दस्तावेज़ पूर्ण ईवेंट कभी नहीं मिलेगा। एक संदेश लूप चलाने के लिए एक डब्ल्यूएफ ऐप में एप्लिकेशन.रुन() या फॉर्म .ShowDialog() को कॉल करने की आवश्यकता होती है।

+0

यह बहुत समझ में आता है! – Jonathan

+0

बहुत बहुत धन्यवाद। धागे में शामिल होने से इस मुद्दे को हल करने में मदद मिली! – Jonathan

3

विशेषता है कि मैं यह त्रुटि देख पाने के लिए प्रयोग किया जाता है: [TestFixture, RequiresSTA]

पर adrianbanks जवाब के अनुसार: How to run unit tests in STAThread mode?

संबंधित मुद्दे