Visual Studio构建失败:无法从obj\debug复制exe文件到bin\debug

199
更新:在Microsoft Connect上可以找到一个重现此bug的示例项目 这里。我还测试并验证了下面被接受的回答在该示例项目中有效。如果这个解决方案对你不起作用,你可能遇到了另一个问题(需要提出一个单独的问题)。

这是之前在Stack Overflow和其他地方问过的问题,但我找到的建议都没有帮助我,所以我只好尝试提一个新的问题。

场景:我有一个简单的Windows Forms应用程序(C#,.NET 4.0,Visual Studio 2010)。它具有大约两个基本表单,大多数其他表单都从中继承,它使用Entity Framework(和POCO类)进行数据库访问。没什么花哨的东西,没有多线程等。

问题:一切都很好一段时间,然后突然间,当我要启动应用程序时,Visual Studio无法构建。我得到了警告"无法删除文件'...bin\Debug\[ProjectName].exe'。路径'...bin\Debug\[ProjectName].exe'的访问被拒绝。和错误"无法将文件'obj\x86\Debug\[ProjectName].exe'复制到'bin\Debug\[ProjectName].exe'。该进程无法访问文件'bin\Debug\[ProjectName].exe',因为另一个进程正在使用它。"(在重新生成时,我会同时获得警告和错误,但仅在构建时获得错误 - 我认为这不相关?)

我完全理解警告和错误消息的含义:显然,Visual Studio正在尝试覆盖exe文件,同时由于某种原因对其进行锁定。但是,这并没有帮助我找到解决问题的方法...唯一我发现有效的方法是关闭Visual Studio并重新启动它。然后构建和启动工作,直到我在某些表单中做出更改,然后我又遇到了同样的问题,不得不重新启动...相当令人沮丧!

如上所述,这似乎是一个已知的问题,因此有很多建议的解决方案。我只列出我已经尝试过的内容,以便人们知道可以跳过什么:

  • 创建一个新的干净解决方案,只需从旧的解决方案中复制文件。
  • 将以下内容添加到项目的预构建事件中:
 if exist "$(TargetPath).locked" del "$(TargetPath).locked"
    if not exist "$(TargetPath).locked" if exist "$(TargetPath)" move "$(TargetPath)" "$(TargetPath).locked"
  • 将以下内容添加到项目属性(.csproj文件)中:

  •  <GenerateResourceNeverLockTypeAssemblies>true</GenerateResourceNeverLockTypeAssemblies>
    

    然而,它们中的任何一个都对我没有用,所以你可能可以看出为什么我开始有点沮丧了。我不知道还能在哪里找到答案,所以希望有人能给我一些建议!这是VS的bug吗?如果是,是否有补丁可用?还是我做错了什么,我有循环引用或类似的问题,如果是,我该如何找出?

    非常感谢任何建议 :)

    更新: 如下评论所述,我还使用Process Explorer进行了检查,确实是Visual Studio锁定了该文件。


    4
    你检查过你的应用程序是否正常关闭了吗?任务管理器是否显示在进程列表中有 [ProjectName].exe? - miensol
    2
    我以前遇到过这个问题,我只是将文件重命名为.old等,然后重新运行构建。虽然不是完美的解决方法,但对我来说有效。 - codingbadger
    2
    @Naliluj:我在微软论坛上看到了这篇文章,它解释说这可能与资源文件有关。如果你正在使用resx文件,这可能会给出一些提示。 - Patrick
    1
    为了后人,我遇到了这个问题,并通过将<GenerateResourceNeverLockTypeAssemblies>true</GenerateResourceNeverLockTypeAssemblies>元素添加到我的csproj文件中来解决它。 - ThisIsTheDave
    在SharpDevelop论坛中可能与此密切相关(具有相同的MSBuild消息):线程 - O. R. Mapper
    显示剩余10条评论
    36个回答

    1
    重命名.exe和.pub文件对我有用,但非常繁琐。我还遇到一个问题,即在调试会话期间无法进行编辑。最后,我按照以下步骤进入了高级安全设置页面:

    https://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k%28%22VS.ERR.DEBUG_IN_ZONE_NO_HOSTPROC%3a11310%22%29;k%28TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22%29&rd=true

    我取消选择 "启用 ClickOnce 安全设置" 复选框,然后重新选择它。现在已经没有问题了...

    1

    先从简单的事情做起。

    检查你的解决方案的某个部分是否被正在运行的进程锁定。

    例如,我在我的Windows服务上运行了“InstallUtil”(我通常从控制台对其进行单元测试)。

    这会锁定我的Windows服务项目bin文件夹中的一些dll文件。当我重新构建时,我遇到了这个问题的异常。

    我停止了Windows服务,重新构建,然后成功了。

    在执行此问题的任何高级步骤之前,请在Windows任务管理器中检查您的应用程序。

    所以当你听到脚步声时,想到的是马而不是斑马!(来自医学生朋友)


    1

    如果有人在调试单元测试或运行单元测试时遇到此问题,我必须杀死以下两个进程才能释放该文件:

    processes to kill.


    0

    我的解决方案与版本、进程被锁定、重启或删除文件无关。

    问题实际上是由于构建失败,没有给出正确的错误提示。 实际问题是设计缺陷:

    // Either this should be declared outside the function, or..
    SomeObject a = new SomeObject(); 
    
    Task.Factory.StartNew(() =>
    {
       while (true)
       {
          a.waitForSomething();
       }
    });
    
    // ...this should not be called
    a.doSomething(); 
    

    将“a”的范围更改为函数外部,或在Task.Factory.StartNew();之后不使用“a”,我就能够再次构建。

    这是在Windows7x64 sp1上使用VS2012 Update 4时发生的。

    错误信息:

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(3390,5): error MSB3030: 无法复制文件“obj\x86\Debug\xxx.exe”,因为找不到该文件。


    0

    0

    其它答案都没能解决我的问题,但关闭 Visual Studio 中所有打开的标签似乎解决了这个问题。


    0
    将另一个项目设置为启动项 构建项目(无问题的项目将显示) 转到有问题的 bin\debug 文件夹 将 myservice.vshost.exe 重命名为 myservice.exe

    0

    我发现在使用VS2013时经常会出现这个错误。一个看起来相当有效的方法是在尝试运行应用程序之前执行“重新生成解决方案”。我发现有时候执行“清理”也可以解决问题,但是“重新生成解决方案”似乎更加稳定。


    0

    对于使用WCF的Windows服务,我终止了WCF主机进程,然后它就可以正常工作了。每当这种情况发生时,我都很讨厌,有时候它会随机发生。


    0
    一个真正帮助我的事情是将 Debug 文件夹中的 ".exe" 添加到我的反病毒软件排除列表中。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接