[英]Unhandled NullReference exception when closing WPF application
當我關閉最后一個窗口時,我的應用程序中出現了未處理的異常:
PresentationFramework.dll中出現未處理的“System.NullReferenceException”類型異常
附加信息:未將對象引用設置為對象的實例。
只有在應用程序的生命周期中,我通過我設置的某個進程打開子窗口時才會出現這種情況。 該窗口存在於另一個程序集中,該程序集在運行時使用MEF動態加載,然后使用Castle進行實例化。 如果我然后調用某個方法,它會創建一個新的STA線程並打開一個WPF對話框窗口。
一些警告:
調用堆棧是:
PresentationFramework.dll!MS.Internal.Controls.ConnectionPointCookie.Disconnect()
PresentationFramework.dll!MS.Internal.Controls.ConnectionPointCookie.Finalize()
有沒有人見過這個,或者有人知道如何調試這個? 奇怪的是,沒有調用堆棧,它在程序退出時正確發生。
你的問題沒有細節,堆棧跟蹤很短,但提供了很多線索來解決潛在的問題。 一些明顯的事實:
使用WebBrowser是一種負擔,瀏覽器通常容易崩潰。 當您在應用程序中使用該控件時,它會被放大,它在進程中運行,並且沒有Internet Explorer本身使用的那種崩潰保護。 因此,瀏覽器中出現問題的任何內容都會直接影響應用程序的穩定性,因為它是非常難以診斷的崩潰原因,因為它是非托管代碼。
這樣的崩潰重演非常糟糕,這是你自己無法獲得重復的核心原因。 瀏覽器中最常見的麻煩制造者是加載項,ActiveX控件(如Flash)和反惡意軟件。 如果您無法控制導航的網站類型,那么您會遇到額外的麻煩,有很多可以故意探測瀏覽器的漏洞。
您可以使用一個特定的對策,當您不再使用它時調用控件的Dispose()方法。 通常在Window的Closing事件處理程序中。 這將立即取消注冊COM事件並觸發崩潰,現在您可以捕獲它。 強烈考慮在發生這種情況時關閉你的程序,你的進程中確實有一個死屍,當你試圖恢復它時會變成一個僵屍。
我在我的一個應用程序中遇到了同樣的問題,從未發現它背后的真正問題。 但我找到了這個應用程序的解決方法。 在主窗口的Closing事件中,我實現了一個關閉所有其他窗口的循環。 然后它奏效了。 也許這對你也有用。 如果你找到它會更好的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.