2011-04-01 8 views
11

मेरे पास एक प्रिंटर क्लास है जो WebBrowser ऑब्जेक्ट के माध्यम से HTML प्रिंट करने में सक्षम है। मैं एक सांत्वना एप्लिकेशन से प्रिंट करने में सक्षम होना चाहते हैं, लेकिन जब अपने प्रिंटर वर्ग एक WebBrowser वस्तु बनाने की कोशिश करता है मैं एक त्रुटि मिलती है:कंसोल एप्लिकेशन में काम करने के लिए WebBrowser नियंत्रण प्राप्त करना?

WebBrowser browser = new WebBrowser(); 

त्रुटि:

ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot 
be instantiated because the current thread is not in a 
single-threaded apartment. 

मैं के लिए एक संदर्भ जोड़ने की कोशिश की System.Windows.Forms मेरे कंसोल एप्लिकेशन में लेकिन यह काम नहीं किया। मेरे पास यहां क्या हो रहा है इसका थोड़ा सा विचार नहीं है, लेकिन मैं मदद की सराहना करता हूं।

+0

यदि अभी भी रुचि है, तो [इस कार्यान्वयन] पर एक लूप है (http://stackoverflow.com/a/19718530/1768303)। – Noseratio

उत्तर

19

अपनी मुख्य विधि में STAThread विशेषता जोड़ें।

[STAThread] 
public static Main() 
{ 
    ... 
} 

अद्यतन: यहाँ तुम क्या धागा जहां ब्राउज़र बनाई गई है साथ क्या करना चाहिए

thread.SetApartmentState(ApartmentState.STA); 

अद्यतन 2:

तो प्रति ऐप एक धागा:

Thread.CurrentThread.SetApartmentState(ApartmentState.STA); 
+0

मेरा प्रोग्राम [STAThread] के साथ चलता है, लेकिन यह वास्तव में प्रिंट नहीं करता है। – sooprise

+0

लेकिन आप ऐप में एक और थ्रेड बना रहे हैं, है ना? –

+0

मेरे पास एक नया नया कंसोल एप्लिकेशन है जो मुख्य विधि में मेरे प्रिंट क्लास से प्रिंट विधि को कॉल करता है। मुझे नहीं लगता कि मैं अपने कंसोल एप्लिकेशन में कोई अन्य धागा बना रहा हूं। कृपया मुझे बताएं कि क्या यह आपके प्रश्न का उत्तर नहीं देता है धन्यवाद। – sooprise

9

एक कंसोल मोड ऐप और वेब ब्राउजर पानी और आग हैं।

  • एक जाँच होना चाहिए, का उपयोग [STAThread] मुख्य() या Thread.SetApartmentState() पर अगर आप एक धागा बनाने: आप एकल पिरोया फ्लैट अनुबंध का पालन करने के एक धागा WebBrowser का उपयोग करने के लिए की जरूरत है।
  • को एक संदेश लूप पंप करना होगा, एप्लिकेशन.रुन() Winforms या WPF में उपलब्ध है।

वेबब्राउज़र के लिए दूसरी आवश्यकता कठिन है, यदि आप इसका उपयोग नहीं करते हैं तो यह इसकी घटनाओं को नहीं रोकेगा। डब्ल्यूबी चलाने वाले थ्रेड को बनाने के लिए कोड के लिए this answer देखें। Winforms या WPF पर आधारित एक जीयूआई ऐप हमेशा डब्लूबीबी का उपयोग करने के लिए पहले से ही इसका मुख्य धागा उपयुक्त होगा।

+0

एसएसआईएस में 'थ्रेड.SetApartmentState()' टिप के लिए धन्यवाद, मैं '[STAThread] 'का उपयोग नहीं कर सकता और मैंने एक विकल्प की तलाश में काफी समय बिताया! – Naigel

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