Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关闭WPF应用程序时出现未处理的NullReference异常_C#_Wpf - Fatal编程技术网

C# 关闭WPF应用程序时出现未处理的NullReference异常

C# 关闭WPF应用程序时出现未处理的NullReference异常,c#,wpf,C#,Wpf,关闭最后一个窗口时,我的应用程序中出现未处理的异常: “System.NullReferenceException”类型的未处理异常 发生在PresentationFramework.dll中 其他信息:对象引用未设置为 反对 只有在应用程序的生命周期内,我通过设置的特定进程打开子窗口时,才会发生这种情况。窗口存在于另一个程序集中,该程序集在运行时使用MEF动态加载,然后使用Castle实例化。如果我随后调用某个方法,它将创建一个新的STA线程并打开一个WPF对话框窗口 一些警告: 这种情况只

关闭最后一个窗口时,我的应用程序中出现未处理的异常:

“System.NullReferenceException”类型的未处理异常 发生在PresentationFramework.dll中

其他信息:对象引用未设置为 反对

只有在应用程序的生命周期内,我通过设置的特定进程打开子窗口时,才会发生这种情况。窗口存在于另一个程序集中,该程序集在运行时使用MEF动态加载,然后使用Castle实例化。如果我随后调用某个方法,它将创建一个新的STA线程并打开一个WPF对话框窗口

一些警告:

  • 这种情况只发生在某些机器/环境上(但我无法辨别模式)
  • 我在应用程序的调度程序上有一个未处理的异常处理程序,它捕获所有未处理的异常。这并没有被那个抓住
调用堆栈是:

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

以前有人见过这个吗,或者有人知道如何调试它吗?奇怪的是,没有调用堆栈,而且它发生在程序退出时。

我在一个应用程序中遇到了相同的问题,但从未发现它背后的真正问题。但是我找到了这个应用程序的解决方法。在主窗口的关闭事件中,我实现了一个循环,以前关闭了所有其他窗口。然后它成功了。也许这对你也有用。如果你找到了原因,那就更好了。

你的问题没有细节,堆栈跟踪很短,但却提供了很多关于潜在问题的线索。一些显而易见的事实:

  • 异常发生在终结器线程上,这就是堆栈跟踪如此短的原因。终结器中未处理的异常是致命的,它们将始终终止程序。尝试在代码中使用try/catch没有效果的原因
  • 连接点cookie是一个COM术语,当您订阅COM事件时会得到一个。当您取消订阅事件时,需要再次使用该cookie,这发生在终结器中。WPF中只有一个类使用它,WebBrowser控件。WPF类是Internet Explorer(一个COM组件)的包装器
  • 该异常虽然具有托管异常名称,但不是由托管代码引起的。终结器已经检查空引用,是Internet Explorer在后台抛出非托管AccessViolationException。CLR会以完全相同的方式处理它们,因为它们有完全相同的原因,终结器不会做任何其他事情来更清楚地区分它们。非托管代码与托管代码一样容易受到空指针的攻击。更重要的是,堆损坏是一个非常常见的原因
  • 终结器已经捕获了所有异常,但是NRE是一个,所以它会重新引用它,这就是程序的结束
使用WebBrowser是一种负担,浏览器一般都很容易崩溃。当你在应用程序中使用控件时,这一点会被放大,它在进程中运行,没有Internet Explorer本身使用的那种崩溃保护。因此,浏览器中出现的任何错误都会直接影响应用程序的稳定性,通常很难诊断崩溃原因,因为爆炸的是非托管代码

这样的崩溃重复得很糟糕,这是你自己很难得到重做的核心原因。浏览器中最常见的麻烦制造者是插件、ActiveX控件(如Flash)和反恶意软件。如果你不能控制浏览的网站类型,你会有额外的麻烦,有很多网站会故意探测浏览器的漏洞


您可以使用一种特定的对策,即在不再使用控件时调用该控件的Dispose()方法。通常在窗口的关闭事件处理程序中。这将立即注销COM事件并触发崩溃,现在您可以捕获它了。当你试图恢复它时,你会强烈地考虑关闭你的程序,在你的进程中有一个死尸会变成僵尸。

我想你需要编辑这个问题来在你的App.xAML文件中包含StudioDead模式。但是,<代码> ShutdownMode < /Cord>属性被设置为<代码> OnMainWindowClose < /C> >,但是,在启动过程中,有几个对话框可以触发,因此在应用程序启动过程中,它会临时切换到
OnExplicitShutdown
,但在主窗口打开之前,它总是会切换回
OnMainWindowClose
。我不知道是什么原因导致了异常,但我会尝试通过从另一个重定向Stderr/Stdio流的应用程序启动它来调试它,并希望(绝对希望)这些流中有一个可以提供线索的人工制品。VisualStudio已经这样做了(通过输出窗口),除了已经提到的内容之外,没有其他意义。嗯,没有,实际上,控制台错误流没有显示在vs输出窗口中。因此,我的建议是,它可能值得检查任何人工制品。事实上,我确实使用了WebBrowser控件(您能够从堆栈跟踪中辨别出这一点的事实令人印象深刻),我将尝试手动处理它,看看这是否能解决问题。仅供参考,该应用程序的目标已经是.NET4,因此它必须像以前的版本一样处理事情。测试后我会在这里更新。好的,取消它,看起来它刚被移动。看起来这就是问题所在!我处理了WebBrowser并丢弃了它产生的任何异常,应用程序现在完全关闭了。谢谢