【问题标题】:Processing in .NET of unmanaged native exception/crash在 .NET 中处理非托管本机异常/崩溃
【发布时间】:2014-03-21 16:53:22
【问题描述】:

我有一个 .NET 应用程序,它在单独的线程中定期调用非托管方法(每 5 秒)。而且这种方法有时会崩溃。我需要以某种方式处理这种情况。主要问题是我无法更改 c++ 非托管代码。

我尝试了不同的方法来处理这个异常,但都没有成功:

  1. 平常

    试试{} 捕捉(例外前) {}

try {} catch {}

2
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

3 System.Windows.Threading.Dispatcher.CurrentDispatcher.UnhandledException += CurrentDispatcher_UnhandledException;

4。 Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;

无论如何,它只是默默地崩溃。

从逻辑上讲,这个线程应该重新启动,但我知道 Thread.Abort() 是一种不好的做法。这种情况的最佳做法是什么?

提前致谢。

【问题讨论】:

  • 您尝试过的具体方法是什么?为什么你不能将有问题的代码包装在 try/catch 中?
  • try/catch 没有帮助。我也试过: 1. AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 2. System.Windows.Threading.Dispatcher.CurrentDispatcher.UnhandledException += CurrentDispatcher_UnhandledException; 3. Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
  • 编辑您的问题以添加您尝试过的内容。特别是显示您尝试的 try/catch 并解释它为什么不起作用。它是静默崩溃还是抛出了其他异常?
  • 另外,您确定错误出在 C++ 代码中吗?您是否有可能将一个对未固定在内存中的数组的引用传递给它?如果在垃圾回收期间移动数组,这可能会导致 C++ 代码崩溃。
  • 吉姆,完成。我已经编辑了问题。它无声地崩溃。

标签: .net multithreading exception exception-handling unmanaged


【解决方案1】:

如果非托管代码使您的进程崩溃,那么您就不走运了。没有异常传播到托管代码。防止这种崩溃的唯一方法是在一个完全独立的进程中启动非托管代码,而不仅仅是一个线程。然后,您可以根据需要使用进程间通信来交换数据,并在进程崩溃时重新启动。

另外,Thread.Abort 不仅是一种不好的做法 - 当线程位于非托管代码中时,它也对您毫无帮助,例如当非托管代码“挂起”时。 Thread.Abort 只允许在线程退出到托管代码时中止线程。

【讨论】:

  • There is no exception propagated to managed code. 我每天都在学习新东西。 :)
  • 您确定不能使用单独的应用程序域而不是单独的进程来解决这个问题吗?
  • @JimMischel 很遗憾,是的。除非在最新版本的 .NET 中有所改变,否则非托管“崩溃”会导致整个过程停止。 AppDomain 只是一个托管结构——它不会影响非托管代码;它非常适合加载插件,但对非托管代码毫无帮助。这也适用于不安全的代码、反射和 P/Invokes - 因此,如果您担心安全性,请不要完全信任您的插件 :) 这也是 Chrome 和其他人在这么多进程中运行的原因 - 无一例外,有没有大量工作就没有恢复选择;重新启动进程很容易。
  • 卢安,谢谢你的回答。我已经尝试了 2 种方法来使用不同的进程,但还没有运气:1)启动另一个控制台应用程序,它写入标准输出并使用 ProcessStartInfo 重定向这个输出。所以我可以获取输出,但是如果子进程崩溃,用户会收到通知。如果我将 CreateNoWindow 属性 [of ProcessStartInfo] 设置为 true,则用户不会看到此通知。但在这种情况下,我无法获取输出。 2) AnonymousPipeServerStream + AnonymousPipeClientStream - 几乎相同。
  • 我也想试试 WCF 或 windows 服务。哪种流程模型更适合我的情况?谢谢。
猜你喜欢
  • 2014-07-09
  • 1970-01-01
  • 2018-09-27
  • 2011-02-20
  • 2015-09-03
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多