2011-04-01 20 views
11

WebBrowser nesnesi üzerinden HTML yazdırabilen bir yazıcı sınıfım var. Bir konsol uygulamasından yazdırmak mümkün olmak istiyorum, ama benim yazıcı sınıfı WebBrowser nesnesi oluşturmak çalıştığında bir hata alıyorum:Konsol Uygulamasında WebBrowser Denetimi Nasıl Kullanılır?

WebBrowser browser = new WebBrowser(); 

Hata:

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

Ben bir başvuru ekleyerek çalıştı System.Windows.Forms benim konsol uygulaması içine ama işe yaramadı. Burada neler olup bittiğine dair en ufak bir fikrim yok, ama yardım için minnettar olurum.

+0

Hala ilgileniyorsanız, [bu uygulama] 'da bir döngüye sahip olun (http://stackoverflow.com/a/19718530/1768303). – Noseratio

cevap

19

Ana yönteminize STAThread özniteliği ekleyin.

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

Güncelleme: Eğer Tarayıcı oluşturulur iplikle ne yapması gerektiğini İşte

thread.SetApartmentState(ApartmentState.STA); 

Güncelleme 2:

ise uygulama başına bir iş parçacığı:

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

Programım [STAThread] ile çalışır, ancak aslında yazdırmaz. – sooprise

+0

Ancak, uygulamada başka bir konu oluşturuyorsunuz değil mi? –

+0

Baskı yöntemimi Main yönteminde yazdırma yöntemini çağıran yepyeni bir konsol uygulamasına sahibim. Konsol uygulamamda başka thread oluşturduğumu sanmıyorum. Bu soruya cevap vermezse lütfen bana bildirin. – sooprise

9

Konsol modu Uygulama ve WebBrowser su ve ateş vardır. Eğer bir iş parçacığı oluşturursanız Main() veya Thread.SetApartmentState() üzerinde [STAThread] kullanın

  • bir STA olmalıdır: Bir iş parçacığı WebTarayıcı kullanmak için sen tek iş parçacıklı sözleşme izlemeniz gerekir.
  • , Winforms veya WPF'de bulunan Application.Run() ileti döngüsünü pompalamalıdır.

İkinci gereksinim WebBrowser için zor olanıdır, kullanmıyorsanız etkinliklerini başlatmaz. WB'yi çalıştıran bir iş parçacığı oluşturmak için this answer'u işaretleyin. Winforms veya WPF'ye dayanan bir GUI uygulaması her zaman WB'yi kullanmak için ana iş parçacığına sahip olacaktır.

+0

"Thread.SetApartmentState()" ipucu için teşekkür ederiz, SSIS'de '' [STAThread] 'i kullanamıyorum ve bir alternatif aramak için çok zaman harcadım! – Naigel