我的托管应用程序正在使用 COM 互操作。不幸的是,COM 组件中存在导致访问冲突的错误。当 bug 发生时,整个应用程序崩溃,附加到的处理程序AppDomain.CurrentDomain.UnhandledException
没有机会运行。我想知道是否有办法处理 AV,向用户显示友好消息并恢复托管应用程序?
2 回答
没有办法“处理”访问冲突。
根据您使用的组件以及它是如何实现的,即使将它隔离在第二个 AppDomain 中也可能会使您的进程崩溃 - AppDomain“只是”一个 .NET 事物,从操作系统的本机角度来看,它们不是孤立的。
如果您有一些有问题的组件,您始终可以使用以下方法使您的使用更加健壮:
创建一个进程 (EXE),它包装该组件的使用并公开一个 API(例如通过任何 IPC 机制)。然后,您可以将该 EXE 作为一个单独的进程(从您的主 EXE)启动并使用它...如果您需要在一段时间后终止该组件和/或满足某些条件时,您可以随时终止该“包装器 EXE”从你的主EXE ...根据特定的组件,在那个“包装器EXE”中实现一些特殊的“清理代码”(可能在一个单独的线程中)甚至可能是有用的,当你需要杀死那个“包装器EXE”时它会被执行”。
由于您在 .NET 中实现此功能,因此您甚至可以在主可执行文件中将该“包装 EXE”作为“嵌入式资源”,甚至可以从 RAM 启动它,而无需将其写入文件系统。
基本上没有办法“处理”访问冲突。您无法知道 COM 组件在发送 AV 之前已丢弃了哪些内存。
对于这样的组件,您唯一能做的就是尝试在单独的 AppDomain 中运行它。这样,如果它崩溃,它只会崩溃一个 AppDomain。