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

Met*_*450 2 c# rpc exception visual-studio

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

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

我多年来一直在维护这个应用程序,以前绝对没有见过这个,所以我开始在 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
Run Code Online (Sandbox Code Playgroud)

我知道我可以告诉 VS 不要打破这些类型的异常,而忽略它们。但正如前面提到的,在开发这个软件多年后,我从未见过它 - 所以我想确切地确定它们何时以及为什么开始,而不是只是视而不见。

Han*_*ant 6

这与您的项目无关。当您使用 shell 对话框(如 OpenFileDialog)时,您将资源管理器加载到您的进程中。这带来了很多包袱,您可以加载所有 shell 扩展。自定义资源管理器的那种,它们在对话框中也能正常工作。

行为不端的人很常见。程序员倾向于使用更古怪的类型。您现在可以看到此类外壳扩展中的任何事故,调试器会告诉您有关情况。

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

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