C# 第一次机会异常:RPC服务器不可用
在开发我的C#应用程序时,每当我创建OpenFileDialog时,VS输出窗格中就会出现以下内容:C# 第一次机会异常:RPC服务器不可用,c#,visual-studio,exception,rpc,C#,Visual Studio,Exception,Rpc,在开发我的C#应用程序时,每当我创建OpenFileDialog时,VS输出窗格中就会出现以下内容: First-chance exception at 0x75A6C42D (KernelBase.dll) in (myapp).exe: 0x000006BA: The RPC server is unavailable. 我已经维护这个应用程序很多年了,而且肯定以前从未见过,所以我开始在SVN中回滚以确定它是何时开始的 令人困惑的是,它发生的修订和没有发生的修订似乎不一致;如果我回顾得足够
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不要破坏这些类型的异常,并忽略它们。但是,正如前面提到的,在使用这个软件多年之后,我从未见过它一次——所以我想确定它们是什么时候以及为什么开始的,而不是睁一只眼闭一只眼。这与您的项目无关。使用shell对话框(如OpenFileDialog)时,将资源管理器加载到进程中。它有很多行李,你还可以装载所有的外壳扩展。自定义资源管理器的那种,它们在对话框中也能正常工作 行为不端的人很常见。程序员倾向于使用更古怪的类型。调试器告诉您,现在您可以看到此类shell扩展中的任何错误 因此,实际上没有出现任何问题,异常被捕获并处理。Explorer针对破坏它稳定的坏shell扩展实现了反措施,并自动禁用它们。所以你只是有一个跛脚鸭壳扩展不起作用,你会注意到的可能性很低,因为它可能已经有一段时间不起作用了
调试器可以告诉你哪一个是坏的。启用非托管调试并勾选“调试+异常”对话框中的抛出复选框。当抛出异常时,调试器现在将停止。您将看不到任何源代码,但可以查看调用堆栈调试器窗口以获取提示。它显示堆栈上某个位置的Windows DLL函数下方包含错误代码的DLL的名称。这个名字应该给你一个提示,哪一个是麻烦制造者。SysInternals的AutoRuns实用程序非常适合禁用它们。从您的测试来看,它似乎是“随机”的,因此错误可能不在您的代码中。由于RPC正在调用远程资源,请检查您的网络、RPC服务器活动等。例如,域身份验证可能会导致此情况。在所有网络连接关闭时会发生此情况。另外,奇怪的是,它似乎从来不会发生在足够旧的版本(即大约3700个修订版)上,而且总是发生在最新的修订版上。所以,虽然它似乎不在我的代码中……但对我来说,它的这种行为仍然是荒谬的。为什么我可以通过回滚修订来阻止它,而通过向前滚动来启动它-但它发生的精确修订并不是那么不可预测?尝试多次重建单个版本,结果总是一样的还是每个构建行为都不同?我只尝试了14次重建:r3982(当前版本)每次都这么做(连续7/7次),r3783(旧版)从未这么做过(0/7)。嗯,很好的洞察力。但是,(1)我不记得最近添加了任何远程的内容(我对我的系统上安装的内容非常好奇,以及(2)如果它与项目没有任何关系,那么回滚修订是否会对是否出现这种情况产生任何影响,这难道不是很奇怪吗?更改修订不会更改存在的浏览器扩展,因此我希望它总是出现,或者永远不会出现,而不管我调试的是哪个修订。否?还有,只要我看不出调用堆栈中有什么明显的可疑之处。似乎所有的MS dll:davclnt.dll不属于您的进程。嗯,没有那么容易摆脱。翻转忽略点…几个月前我在玩WebDAV。但是,我不明白为什么只有在运行某些修订时才会出现这种情况,而在运行其他修订时不会出现。我只尝试了14次一行:一行重建了r3982 7x,每次都显示异常;一行重建了r3783 7x,但从来没有显示过。根据最初的问题,一些修订是不一致的。像这样的异常似乎应该是一致的可复制的-如果它与我的代码无关,应该不会受到我的修订的影响我正在使用。在我的例子中,是过时的驱动器映射导致了问题。由于缓存了驱动器映射失败的结果,因此结果不一致。使用文件资源管理器从“这台电脑”中删除损坏的驱动器映射,错误将消失。