2010-10-11 13 views
8

Sonuç olarak, uygulamayı sonlandırmak için bir sonlandırıcıda bir istisna atabilen bir hatalı kütüphaneyle sorun yaşıyorum.Başka bir AppDomain uygulamasında yakalanmamış bir istisnanın uygulamayı kapatmasını engelleyebilir miyim?

Bundan kaçınmak için, kütüphaneyi kendi AppDomain alanına yüklemeyi denedim, ancak istisna hala yüzeye kabarcıklar ve uygulamayı çöker.

MSDN'de belgelendiği gibi, AppDomain.UnhandledException'a kaydolmak istisnanın kösteklenmesini engellemez, ancak "alt UygulamaAlanı'nda" böyle bir istisnayı yakalamanın başka bir yolu olmadığına şaşıyorum.

Eklenti barındıran veya potansiyel olarak zararlı kodları engellemek için AppDomains kullanan uygulamalar, işlenmeyen özel durumları durdurmak için ne yapar? Aslında mümkün mü?

Not Not: Zaten here açıklanan bir başka geçici çözüm var. Kötü sonlandırıcı, yalnızca kapatma sırasında toplanmış gibi görünen uzun ömürlü bir nesnedir, bu nedenle bu "sahte" hatayı kullanıcıdan gizlemek yeterlidir. Yine de, bu geçici çözümü kırılgan buluyorum, çünkü nesne daha önce toplanmışsa, diğer hataları, ya da uygulamaumu şişirmek riskini gizleyecektir.

+0

Neden istisnayı yakalayamıyorsunuz – rerun

+0

İstisna, CLR tarafından yönetilen kendi iş parçacığında çalışan bir Finalizer'a atılıyor, bu yüzden iş parçacığına bir istisna işleyicisi koyamıyorum. Ayrıca, bu, "kaynak kodu olmayan" eski, unmaintaiend ve önemli bir bileşen "bir kütüphane ... –

cevap

4

Bir AppDomain, program durumunu iptal edebildiğiniz için güzeldir, ancak hala iş parçacığının öldüğü sorunu vardır. Sonlandırıcı iş parçacığında bu olayın ölümcül olduğu, CLR işlem yapılmadan işlemi iptal edecektir.

Yalnızca 'düzeltme', bu bileşeni kendi işleminde yürütmektir. Sonlandırıcı iş parçacığının işlem çıkışında çalışmasını önlemek için Process.Kill() ile başın içine çekebilirsiniz. .NET'in onunla konuşması için desteklediği süreçler arası iletişim mekanizmalarından birini kullanın. Bir soket, adlandırılmış boru, Remoting veya WCF. Onunla iyi şanslar.

+0

Cevabı için teşekkürler, AppDomains arasında çok daha iyi bir yalıtım olduğunu düşündüm, çok kötü. Şu andaki mevcut çözümle birlikte kalacağımızı düşünüyorum ve kütüphaneyi bir sonraki versiyonda kendi süreçlerinde ayıracağız. –

0

Aslında, .NET 1.0/1.1'e geri döndüğünüzde, gerek duyduğunuz gibi davranır. Hala sadece "çalışma zamanı" düğüm içinde, başvurunuz yapılandırma dosyasına bu satırı ekleyerek bu davranışa dönebilirsiniz:

<runtime> 
    <legacyUnhandledExceptionPolicy enabled="1"/> 
</runtime> 

Bu

tüm süreci sonlandırma farklı bir iş parçacığı içinde işlenmeyen bir özel durum önleyecektir.

+2

Bu seçenek hakkında biliyorum, ancak bu, her iş parçacığının istisnalarını gizlerdi; bu kesinlikle istediğim gibi değil. –

İlgili konular