1

我的托管应用程序正在使用 COM 互操作。不幸的是,COM 组件中存在导致访问冲突的错误。当 bug 发生时,整个应用程序崩溃,附加到的处理程序AppDomain.CurrentDomain.UnhandledException没有机会运行。我想知道是否有办法处理 AV,向用户显示友好消息并恢复托管应用程序?

4

2 回答 2

4

没有办法“处理”访问冲突。

根据您使用的组件以及它是如何实现的,即使将它隔离在第二个 AppDomain 中也可能会使您的进程崩溃 - AppDomain“只是”一个 .NET 事物,从操作系统的本机角度来看,它们不是孤立的。

如果您有一些有问题的组件,您始终可以使用以下方法使您的使用更加健壮:

创建一个进程 (EXE),它包装该组件的使用并公开一个 API(例如通过任何 IPC 机制)。然后,您可以将该 EXE 作为一个单独的进程(从您的主 EXE)启动并使用它...如果您需要在一段时间后终止该组件和/或满足某些条件时,您可以随时终止该“包装器 EXE”从你的主EXE ...根据特定的组件,在那个“包装器EXE”中实现一些特殊的“清理代码”(可能在一个单独的线程中)甚至可能是有用的,当你需要杀死那个“包装器EXE”时它会被执行”。

由于您在 .NET 中实现此功能,因此您甚至可以在主可执行文件中将该“包装 EXE”作为“嵌入式资源”,甚至可以从 RAM 启动它,而无需将其写入文件系统。

于 2013-05-14T20:53:20.910 回答
1

基本上没有办法“处理”访问冲突。您无法知道 COM 组件在发送 AV 之前已丢弃了哪些内存。

对于这样的组件,您唯一能做的就是尝试在单独的 AppDomain 中运行它。这样,如果它崩溃,它只会崩溃一个 AppDomain。

于 2013-05-14T20:44:27.367 回答