第一次机会异常:RPC 服务器不可用

本文关键字:服务器 RPC 机会 异常 第一次 | 更新日期: 2023-09-27 18:36:57

在开发 C# 应用程序时的某个时候,每当我创建 OpenFileDialog 时,VS 输出窗格中都会出现以下内容:

First-chance exception at 0x75A6C42D (KernelBase.dll) in (myapp).exe: 0x000006BA: The RPC server is unavailable.

多年来我一直在维护这个应用程序,以前绝对从未见过这个,所以我开始在SVN中回滚以确定它何时开始。

令人困惑的是,它发生和没有发生的修订似乎不一致;如果我回溯得足够远,它永远不会发生,但是有一个"区域",我可以检查修订,它不会发生,我会检查另一个修订,它会,然后我会回到第一个,这次它突然会发生。 换句话说,我似乎无法可靠地确定它何时开始发生。

为了说明这一点,以下是我的测试摘录,为清楚起见缩进。数字是修订。对于每个测试,我都会"更新到修订版"并进行完全重建。

      3977: Exception. This is the most-recent revision.
 3839: OK.  Since it didn't happen, I'll start working my way back up to see when it starts
   3843: OK
    3852: OK
     3890: Exception. So it started between 3852 & 3890.
    3852: Exception. Huh?? I JUST tried 3852, and last time it didn't happen!
3778: OK. Going back this far, I've never seen it happen.
    3852: Exception. I guess I'll start working my way BACK to see when it stops.
   3828: Exception
  3810: OK
   3828: Exception.  Just making sure.
  3810: OK. Just making sure again.
   3828: OK.  What?? 3828 showed the exception last time I tried!
    3852: OK. (but previously it showed the exception)
     3890: Exception

我知道我可以告诉VS不要破坏这些类型的异常,并忽略它们。 但如前所述,经过多年的软件工作,我从未见过它一次 - 所以我想确切地确定他们何时以及为什么开始,而不是视而不见。

第一次机会异常:RPC 服务器不可用

这与你的项目无关。 使用 shell 对话框(如 OpenFileDialog)时,会将资源管理器加载到进程中。 这带来了很多行李,您还可以加载所有外壳扩展件。 自定义资源管理器的那种,它们在对话框中同样有效。

行为不端是很常见的。 程序员倾向于使用更古怪的那种。 现在,这种 shell 扩展中的任何事故都对您可见,调试器会告诉您。

因此,实际上没有任何问题,异常被捕获并处理。 资源管理器针对破坏其稳定性的坏外壳扩展实施对策,并自动禁用它们。 所以你只有一个不起作用的跛脚鸭壳扩展,你会注意到的几率很低,因为它可能已经有一段时间没有工作了。

调试器可以告诉您哪一个是坏的。 启用非托管调试,并在"调试 + 异常"对话框中勾选"抛出"复选框。 调试器现在将在引发异常时停止。 你不会看到任何源代码,但可以查看"调用堆栈调试器"窗口以获取提示。 它显示包含堆栈上某处错误代码的 DLL 的名称,位于 Windows DLL 函数下方。 这个名字应该给你一个提示,哪一个是麻烦制造者。 SysInternals的AutoRuns实用程序非常适合禁用它们。