【问题标题】:How do I catch c0000005 exception from native dll in c#如何在 c# 中从本机 dll 中捕获 c0000005 异常
【发布时间】:2011-08-11 17:09:54
【问题描述】:

我正在使用本机 dll,该 dll 在某处引发 c0000005 异常(访问冲突)并最终导致我的 Web 服务崩溃,直到服务被回收。有没有办法捕获异常?

【问题讨论】:

  • 捕获访问冲突没有什么意义,实际上 .NET 4 默认情况下会阻止您这样做。见msdn.microsoft.com/en-us/magazine/dd419661.aspx
  • 不同意到目前为止的评论和答案。 为了重新启动 web 服务 捕获异常是可以的。从业务角度来看,自动重启胜过手动重启。两者都会导致停机,但数量不同。
  • 捕获异常以了解哪个dll调用出错也是一个很好的理由。重新它,因为忽略它不好。

标签: c# c++ native-code


【解决方案1】:

我同意其他人...

在 .net 4+ 中,您可以添加 HandleProcessCorruptedStateExceptions 属性,它将作为您可以捕获的异常出现。调用堆栈并不是非常有用,但总比没有好。

C#

[System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions]
public void SomeCSharpMethod()
try
{
  // call managed code
}
catch (Exception ex)
{
  Console.WriteLine("Exception");
}

C++

vector<int> myValues;
int a = myValues[1];

【讨论】:

  • 我同意双方的观点:(1)解决真正的问题; (2) 捕获异常以更好地了解真正的问题是什么。我建议您重新抛出异常以避免忘记它。捕捉它的目的是了解它,而不是忽视它。
  • @Jerry 你让我开心了,我需要在控制台应用程序打开的 wpf 窗口下获取系统图标;在只能崩溃的旧操作系统中(甚至没有给出 0 值作为 hresult),在新操作系统中工作正常。现在我可以捕获异常,一切正常,谢谢! :)
【解决方案2】:

您可以使用 Microsoft SEH exception handler 捕获异常,但实际上您应该修复任何错误。

干杯,

【讨论】:

  • 希望我能修复它,但它在第 3 方 dll 中。
  • @Marty:仅仅因为在第 3 方 DLL 中检测到错误,并不意味着错误发生。检查所有输入并仔细阅读文档。您可能传递了错误的输入!
  • 我不同意所有在 C# 应用程序中捕获这种 C++ 异常“毫无意义”的说法。如果可以捕获异常,打印出一些调试信息,然后重新抛出异常,那么可以更好地知道 哪个 对 DLL 的调用具有错误的参数。
【解决方案3】:

不要抓住这个。修复错误。

0xc0000005STATUS_ACCESS_VIOLATION 的 NT 错误代码。这意味着您的程序进行了错误的指针取消引用。简而言之,这意味着您的程序严重崩溃并且尝试恢复是错误的。

我知道你说它是第 3 方 DLL,但至少你应该调试并理解这个问题。这可能很简单,例如您向 DLL 传递了一些错误的输入或未正确初始化它。如果您不能这样做,您可以联系 DLL 的作者或考虑消除对他们的依赖。

【讨论】:

  • 您可能认为解决问题的第一步是先抓住它,以便您可以更详细地检查故障
猜你喜欢
  • 2012-08-10
  • 1970-01-01
  • 2023-03-28
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
相关资源
最近更新 更多