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

First-chance exception: The RPC server is unavailable

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

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

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

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

为了说明这一点,这里是我的测试的摘录,为清楚起见缩进了。数字是修订版。对于每个测试,我 "update to revision" 并进行完全重建。

      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 不要中断这些类型的异常,并忽略它们。但如前所述,在使用该软件多年后,我从未见过它一次 - 所以我想确定 whenwhy 他们开始了,而不是视而不见。

这与您的项目无关。当您使用 shell 对话框(如 OpenFileDialog)时,您会将 Explorer 加载到您的进程中。这带来了很多负担,您 加载了所有 shell 扩展。自定义资源管理器的那种,在对话框中也一样好用。

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

所以,实际上没有出错,异常被捕获并处理了。 Explorer 实施反制措施以防止破坏它稳定的不良 shell 扩展并自动禁用它们。因此,您只有一个无法正常工作的跛脚鸭 shell 扩展程序,您会注意到它的可能性很低,因为它可能已经有一段时间没有工作了。

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