2014-04-30 17 views
12

tôi nhận được một ngoại lệ nào trong ứng dụng của tôi khi tôi đóng cửa sổ cuối cùng:Unhandled NullReference ngoại lệ khi đóng WPF ứng dụng

Một ngoại lệ unhandled của loại 'System.NullReferenceException' xảy ra ở PresentationFramework.dll

Thông tin bổ sung: Tham chiếu đối tượng không được đặt thành phiên bản đối tượng .

Điều này chỉ xảy ra nếu, trong suốt thời gian của ứng dụng, tôi mở một cửa sổ con thông qua một quá trình nhất định mà tôi đã thiết lập. Cửa sổ tồn tại trong một assembly khác được nạp tại thời gian chạy động với MEF, và sau đó được khởi tạo với Castle. Nếu sau đó tôi gọi một phương thức nào đó, nó tạo ra một luồng STA mới và mở một cửa sổ hộp thoại WPF.

Một số hãy cẩn thận:

  • này chỉ xảy ra trên một số máy/môi trường (Tôi không thể phân biệt một mô hình mặc dù)
  • Tôi có một handler UnhandledException trên phối cho các ứng dụng mà bắt tất cả các ngoại lệ chưa được giải quyết. Đây không phải là bắt gặp bởi điều đó.

Cuộc gọi chồng là:

PresentationFramework.dll!MS.Internal.Controls.ConnectionPointCookie.Disconnect() 
PresentationFramework.dll!MS.Internal.Controls.ConnectionPointCookie.Finalize() 

Có ai thấy điều này trước đây, hoặc bất cứ ai sẽ biết làm thế nào để gỡ lỗi này? Thật kỳ lạ là không có ngăn xếp cuộc gọi và nó xảy ra ngay khi chương trình đang thoát.

+0

Tôi nghĩ bạn cần chỉnh sửa câu hỏi này để bao gồm ShutdownMode trong tệp app.xaml của bạn. –

+0

Thuộc tính 'ShutdownMode' được đặt thành' OnMainWindowClose', tuy nhiên, trong khi khởi động có một vài hộp thoại có thể được kích hoạt, vì vậy tạm thời chuyển sang 'OnExplicitShutdown' trong khi khởi động ứng dụng, nhưng nó luôn ** được chuyển trở lại để 'OnMainWindowĐóng' trước khi cửa sổ chính thậm chí mở ra. – qJake

+0

Tôi không biết điều gì gây ra ngoại lệ, nhưng tôi sẽ cố gắng gỡ lỗi nó bằng cách khởi động nó từ một ứng dụng khác chuyển hướng các luồng Stderr/Stdio và hy vọng (hoàn toàn * hy vọng *) có một vật phẩm trong các luồng đó cung cấp một đầu mối . –

Trả lời

13

Câu hỏi của bạn không có chi tiết và theo dõi ngăn xếp ngắn nhưng đưa ra nhiều manh mối về vấn đề cơ bản. Một số thông tin hiển thị:

  • ngoại lệ xảy ra trên chuỗi kết thúc, lý do ngăn xếp theo dõi quá ngắn. Một ngoại lệ không được giải quyết trong một finalizer là gây tử vong, họ sẽ luôn luôn chấm dứt chương trình. Lý do mà cố gắng sử dụng try/catch trong mã của bạn không có hiệu lực.
  • cookie kết nối điểm là thuật ngữ COM, bạn nhận được một khi bạn đăng ký sự kiện COM. Cookie đó cần được sử dụng lại khi bạn hủy đăng ký sự kiện, điều đó xảy ra trong finalizer. Chỉ có một lớp trong WPF sử dụng nó, điều khiển WebBrowser. Lớp WPF là một trình bao bọc xung quanh Internet Explorer, một thành phần COM.
  • ngoại lệ, trong khi nó có tên ngoại lệ được quản lý, không phải do mã được quản lý gây ra. Trình finalizer đã kiểm tra các tham chiếu null, nó là Internet Explorer mà ném một AccessViolationException không được quản lý dưới mui xe. Chúng được xử lý theo cùng một cách chính xác bởi CLR vì chúng có cùng một nguyên nhân chính xác, finalizer không làm bất cứ điều gì để làm cho sự phân biệt rõ ràng hơn. Mã không được quản lý cũng dễ bị tổn thương như mã được quản lý đối với các con trỏ null. Hơn thế nữa, tham nhũng heap là một nguyên nhân rất phổ biến.
  • trình hoàn tất đã bắt tất cả ngoại lệ, tuy nhiên, một NRE là critical exception để nó trả lời nó, đó là kết thúc chương trình của bạn.

Sử dụng WebBrowser là trách nhiệm pháp lý, trình duyệt nói chung khá dễ bị tai nạn. Điều này được khuếch đại khi bạn sử dụng điều khiển trong ứng dụng của mình, nó chạy trong quá trình và không có loại bảo vệ sự cố mà chính Internet Explorer sử dụng. Vì vậy, bất cứ điều gì mà đi sai trong trình duyệt sẽ trực tiếp ảnh hưởng đến sự ổn định của ứng dụng của bạn, thường là rất khó để chẩn đoán lý do tai nạn vì nó không được quản lý mã mà bom.

Và các sự cố như vậy lặp lại rất kém, lý do cốt lõi khiến bạn gặp khó khăn khi tự mình lấy lại bản thân. Những người gây rối phổ biến nhất trong các trình duyệt là bổ trợ, điều khiển ActiveX (như Flash) và phần mềm chống phần mềm độc hại. Bạn sẽ gặp thêm rắc rối nếu bạn không thể kiểm soát loại trang web được điều hướng, có rất nhiều điều dò tìm trình duyệt cho các lỗ hổng có chủ ý.

Có một biện pháp đối phó cụ thể mà bạn có thể sử dụng, hãy gọi phương thức Vứt bỏ() của điều khiển khi bạn không còn sử dụng nó nữa. Thông thường trong trình xử lý sự kiện Closing của Window. Điều đó sẽ ngay lập tức hủy đăng ký sự kiện COM và kích hoạt sự cố, bây giờ bạn có thể bắt nó. Hãy xem xét chặt chẽ chương trình của bạn khi điều đó xảy ra, bạn có một xác chết trong quá trình của bạn sẽ biến thành một zombie khi bạn cố gắng hồi sinh nó.

+0

Tôi thực sự sử dụng một điều khiển WebBrowser (thực tế là bạn đã có thể nhận ra rằng chỉ từ dấu vết ngăn xếp là ấn tượng), và tôi sẽ cố gắng xử lý nó bằng tay để xem liệu biện pháp khắc phục có khắc phục được không. FYI, ứng dụng đã được nhắm mục tiêu .NET 4, do đó, nó phải được xử lý những thứ tương tự như các phiên bản trước đã làm. Tôi sẽ cập nhật ở đây sau khi tôi đã thử nghiệm nó. – qJake

+0

OK, hủy bỏ, có vẻ như nó đã được di chuyển. –

+0

Có vẻ như đó là vấn đề! Tôi đã xử lý WebBrowser và loại bỏ bất kỳ ngoại lệ nào xuất phát từ nó, và ứng dụng tắt ngay bây giờ. Cảm ơn! – qJake

1

Tôi đã gặp vấn đề tương tự trong một trong các ứng dụng của mình và không bao giờ tìm thấy vấn đề thực sự đằng sau nó. Nhưng tôi tìm thấy một giải pháp cho ứng dụng này. Tại sự kiện đóng cửa của cửa sổ chính, tôi đã thực hiện một vòng lặp đóng tất cả các cửa sổ khác trước đó. Sau đó, nó hoạt động. Có lẽ điều này có thể làm việc cho bạn quá. Nếu bạn tìm thấy lý do nó sẽ tốt hơn.

Các vấn đề liên quan