C# 如何在SafeFileHandle终结器中处理SEH异常?

C# 如何在SafeFileHandle终结器中处理SEH异常?,c#,.net,C#,.net,我看到在某些环境中,SafeFileHandle的终结器抛出一个SEHException,因为终结器正在尝试关闭一个已经关闭的句柄 问题是只有在调试器已连接的情况下才必须抛出SEHException。 在其他情况下,它不应该对CloseHandleAPI执行任何操作 但在clean envs上没有任何调试器(没有抗病毒药物、VS或类似的东西),我们观察到了这样的问题。看起来像是.NET或Windows错误 我看到了一个解决方案—编写一个自定义的SafeFileHandle,它将在dispose中

我看到在某些环境中,
SafeFileHandle
的终结器抛出一个
SEHException
,因为终结器正在尝试关闭一个已经关闭的句柄

问题是只有在调试器已连接的情况下才必须抛出
SEHException
。 在其他情况下,它不应该对
CloseHandle
API执行任何操作

但在clean envs上没有任何调试器(没有抗病毒药物、VS或类似的东西),我们观察到了这样的问题。看起来像是.NET或Windows错误

我看到了一个解决方案—编写一个自定义的
SafeFileHandle
,它将在dispose中处理
SEHException
。但是我需要重构这个庞大的项目,并替换所有的
SafeFileHandles


是否有任何方法
UnhandledException
handler吞下此异常或中止导致此异常的线程(
GC
finilizer线程)?有什么想法吗?

就例外情况而言,这是一个非常棘手的问题。这是一种你永远不会希望通过假设它是一个CLR或OS错误而消失的错误。只有内存损坏才能提供一个简单的解释。或者是SafeHandle可以防止的一件事,恶意软件发起的句柄回收攻击。获取小型转储,请致电Microsoft支持。如果出现异常,99.9%的可能性是您的代码错误。。。显然,如果您关闭一个已经关闭的句柄,那么您的代码就有一个bug。因此,您应该修复不平衡的打开/关闭。如果您的应用程序很复杂,并且文件可以在不同的时间打开或关闭,特别是如果多线程或多个事件处理程序可能导致同一文件的并发使用,那么编写自己的代码来管理打开和关闭也可能会有帮助。@Phil1970我没有关闭已经关闭的句柄。Net framework正在为已关闭的文件调用finilizer!(手柄状态=3-关闭)。我不会使用本机CloseHandle调用关闭它,因为在这种情况下,句柄状态将不为=3(关闭)。我无法同步.NET GC并将GC与我的代码同步!我得到的SEHException在没有调试器的情况下是无效的。就异常而言,这是一个可怕的问题。这是一种你永远不会希望通过假设它是一个CLR或OS错误而消失的错误。只有内存损坏才能提供一个简单的解释。或者是SafeHandle可以防止的一件事,恶意软件发起的句柄回收攻击。获取小型转储,请致电Microsoft支持。如果出现异常,99.9%的可能性是您的代码错误。。。显然,如果您关闭一个已经关闭的句柄,那么您的代码就有一个bug。因此,您应该修复不平衡的打开/关闭。如果您的应用程序很复杂,并且文件可以在不同的时间打开或关闭,特别是如果多线程或多个事件处理程序可能导致同一文件的并发使用,那么编写自己的代码来管理打开和关闭也可能会有帮助。@Phil1970我没有关闭已经关闭的句柄。Net framework正在为已关闭的文件调用finilizer!(手柄状态=3-关闭)。我不会使用本机CloseHandle调用关闭它,因为在这种情况下,句柄状态将不为=3(关闭)。我无法同步.NET GC并将GC与我的代码同步!我得到的SEHException没有调试器是无效的。