gpt4 book ai didi

c# - 如何处理 AccessViolationException

转载 作者:IT王子 更新时间:2023-10-29 03:30:39 26 4
gpt4 key购买 nike

我在 .net 应用程序中使用 COM 对象 (MODI)。我调用的方法抛出 System.AccessViolationException,它被 Visual Studio 拦截。奇怪的是,我将我的调用包装在一个 try catch 中,它具有 AccessViolationExceptionCOMException 和其他一切的处理程序,但是当 Visual Studio (2010) 拦截 AccessViolationException,调试器中断方法调用 (doc.OCR),如果我单步执行,它会继续到下一行而不是进入 catch block 。此外,如果我在 visual studio 之外运行它,我的应用程序就会崩溃。我该如何处理在 COM 对象中抛出的这个异常?

MODI.Document doc = new MODI.Document();
try
{
doc.Create(sFileName);
try
{
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
sText = doc.Images[0].Layout.Text;
}
catch (System.AccessViolationException ex)
{
//MODI seems to get access violations for some reason, but is still able to return the OCR text.
sText = doc.Images[0].Layout.Text;
}
catch (System.Runtime.InteropServices.COMException ex)
{
//if no text exists, the engine throws an exception.
sText = "";
}
catch
{
sText = "";
}

if (sText != null)
{
sText = sText.Trim();
}
}
finally
{
doc.Close(false);

//Cleanup routine, this is how we are able to delete files used by MODI.
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc);
doc = null;
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();

}

最佳答案

编辑 (3/17/2021)

免责声明:此答案写于 2011 年,引用了原始的 .NET Framework 4.0 实现,而不是 .NET 的开源实现。


在 .NET 4.0 中,运行时处理作为损坏状态指标的 Windows 结构化错误处理 (SEH) 错误引发的某些异常。您的标准托管代码不允许捕获这些损坏状态异常 (CSE)。我不会进入这里的原因或方式。阅读这篇关于 .NET 4.0 Framework 中的 CSE 的文章:

http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035

但还是有希望的。有几种方法可以解决这个问题:

  1. 重新编译为 .NET 3.5 程序集并在 .NET 4.0 中运行它。

  2. 在 configuration/runtime 元素下的应用程序配置文件中添加一行: <legacyCorruptedStateExceptionsPolicy enabled="true|false"/>

  3. HandleProcessCorruptedStateExceptions 装饰你想捕获这些异常的方法属性。参见 http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035了解详情。


编辑

之前,我引用了一个 forum post了解更多详情。但由于 Microsoft Connect 已停用,这里有一些额外的详细信息,以备您感兴趣:

来自 Microsoft CLR 团队的开发人员 Gaurav Khanna

This behaviour is by design due to a feature of CLR 4.0 called Corrupted State Exceptions. Simply put, managed code shouldnt make an attempt to catch exceptions that indicate corrupted process state and AV is one of them.

然后他继续引用关于 HandleProcessCorruptedStateExceptionsAttribute 的文档和上面的文章。可以这么说,如果您正在考虑捕获这些类型的异常,那么这本书绝对值得一读。

关于c# - 如何处理 AccessViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3469368/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com