调试停止后VS 2k8不释放文件句柄:无法将文件X复制到输出目录,因为它正由另一个进程使用

时间:2008-10-08 17:25:39

标签: visual-studio visual-studio-2008

每隔一段时间,通常当我在UI程序集中停止调试时,我会收到以下错误,需要重新启动Visual Studio 2008并且这会降低我的工作效率:

  

错误13无法复制文件   [UI汇编]   至   [输出目录]。   该进程无法访问该文件   [输出目录] [UI汇编]   因为它被另一个人使用   过程

重新启动后,我收到此错误:

  

错误1元数据文件[RELEASE文件夹中的实用程序功能程序集]无法执行   被发现。

我发现这真的很奇怪,因为我们从不使用Release配置。

我在Windows Vista上使用VS 2k8 SP1。

我知道VS调试器没有通过使用handle实用程序(以前来自Sysinternals)释放其文件句柄。该过程是devenv.exe。

我尝试过关闭并重新打开解决方案。没工作。只有完整的VS2k8重启才能正常工作。

我已尝试添加预构建事件,按照here所述移动文件,但这不起作用,因为Windows无法删除文件的原因与无法替换它的原因相同:它有一个开放的手柄。

我甚至尝试使用上面描述的handle.exe util手动关闭句柄,然后尝试预构建事件。 Visual Studio显然不知道它的句柄已经关闭,因为VS构建失败,但handle.exe没有显示相关文件上的打开文件句柄。

对于记录,这是我运行的加载项:

  • ReSharper 4
  • Smart Paster 2008
  • Typemock Isolator
  • TestDriven.NET 2.13.2184

我也为此项目使用Developer Express控件,因此也可能与它有关。

7 个答案:

答案 0 :(得分:2)

我在VS2005和VS2008中遇到过类似的问题,没有安装任何加载项或项目中的任何第三方控件。我发现的唯一解决方案是关闭Visual Studio并重新打开它。这是一个非常间歇性的问题,虽然很烦人,但似乎无法解决这个问题。

答案 1 :(得分:1)

您可以尝试使用此预构建事件脚本:

如果存在“$(TargetPath).locked”del“$(TargetPath).locked” 如果不存在“$(TargetPath).locked”move“$(TargetPath)”“$(TargetPath).locked”

有些人报告说它解决了这个问题。

更新:

你有没有机会在你的.config(或machine.config?)中这个

<hostingEnvironment shadowCopyBinAssemblies="false"/>

这似乎会在构建问题期间创建(或者可能只是加剧)原始的“无法复制”。当然,我只是将该设置添加到我的项目中,因为在调试ASP.NET无法隐藏/复制DLL时遇到错误。然而,在后面看来,这个问题比锁定问题更容易处理。有了影子/副本问题,你只需要构建然后等待几秒钟。这有点令人讨厌,但肯定不是每次你想要进行构建时重新启动Visual Studio的问题!

答案 2 :(得分:1)

在兼容模式下使用xp或vista启动visual studio应用程序解决了我的环境中的问题(win7 64bit)。

答案 3 :(得分:0)

Unlocker工具可以帮助您解决问题。

答案 4 :(得分:0)

在构建我们的项目时,VS2002遇到了类似的问题。我们通过将应用程序构建到一个公共构建文件夹(即{SolutionRoot} \ Build)来升级到VS2005时修复了它。

答案 5 :(得分:0)

我开始注意到在执行在Application.Idle期间调用的方法时,似乎更有可能发生(也许只会发生)。

答案 6 :(得分:0)

由于某种原因,似乎可以通过更改程序集的输出名称以匹配默认名称空间来解决此问题。

我通过https://connect.microsoft.com/VisualStudio/feedback/Workaround.aspx?FeedbackID=114694找到了解决方法。预构建脚本选项有效,但仅在程序集已存在时才有效。如果你进行了清理/构建,它将无法工作。