处理COM互操作中的访问冲突

时间:2013-05-14 20:41:45

标签: c# .net com-interop

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

2 个答案:

答案 0 :(得分:4)

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

取决于您正在使用的组件及其实现方式,即使在第二个AppDomain中隔离它也可能会使您的进程崩溃 - AppDomains“仅”是一个.NET事物,从操作系统的本机角度来看它们并非孤立

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

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

由于您在.NET中实现了这一点,您甚至可以将“wrapper EXE”作为“嵌入式资源”放在主可执行文件中,甚至可以从RAM启动它而无需将其写入文件系统。

答案 1 :(得分:1)

根本没有办法“处理”访问冲突。在发送AV之前,您无法知道COM组件已经破坏了哪个内存。

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