我最近将应用程序从.net 3.5升级到4.0。由于我这样做了,使用调试设置来中断所有启用的异常,每次我启动使用EF连接到数据库的应用程序部分时,我都会得到一些这些异常。确切的数字是可变的;有时候我只会快速接连一个,其他几个快速连续。
检测到ReleaseHandleFailed消息:SafeHandle或 CriticalHandle的类型 ' Microsoft.Win32.SafeHandles.SafeCapiHashHandle'没能正常 释放值为0x06AD3D08的句柄。这通常表明了这一点 通过其他方式错误地释放句柄(例如 使用DangerousGetHandle提取句柄并直接关闭它 或围绕它建立另一个SafeHandle。)
在定位3.5时,我从未遇到过这样的例外情况。这些例外没有附加任何有意义的调用堆栈,我得到的只是[External Code]
,拒绝任何简单的方法来本地化他们来自哪里。我怀疑EntityFramework在某种程度上涉及的原因是该应用程序的一部分使用nHiberate而不生成任何这些消息。
要运行可能涉及的其他依赖项:在所有情况下,ORM正在与Sql Compact数据库通信MS Sync Framework 2.1用于从SqlServer更新本地数据库。使用4.0框架重新生成了Entity框架模型,我也将缓存DB升级到了v4.0。
由于没有调用堆栈,我不确定这些消息是否属于"无害"错误在框架内部自动清理;或者,如果有异常食客在应用程序的其他地方捕获它们。
答案 0 :(得分:6)
这不是一个例外,它是一个托管调试助手警告。当您将设置更改为"在所有启用的例外时中断"时,您可能已经过度了一些。 Debug + Exceptions,Managed Debugging Assistants节点,取消" ReleaseHandleFailed"警告。它默认是关闭的。
MDA捕获了一个在AesCryptoServiceProvider类中未检测到的旧bug。背景资料is here。
从你的评论来看,你将犯一个严重的错误。您通过避免加密或损害dbase连接安全性来不解决此问题。你不小心打开了一个通常关闭的MDA。 MDA通常会产生错误警告,其中许多都会被默认关闭。该警告实际上是假的,释放句柄失败因为它已经被释放。这发生在终结器线程中,这就是为什么你没有得到堆栈跟踪。因此,首先不能轻易找出使用该类的代码。
修复它的正确方法是正确使用Debug + Exceptions对话框。单击“全部重置”按钮修复您创建的问题。然后单击仅“公共语言运行时异常”的“Thrown”复选框。这就是你要调试的内容。