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个回答

    0

    当我遇到类似问题时,唯一有效的方法是:

    • 右键单击项目,进入设置,并确保调试和发布版本使用相同的设置,或者包含应用程序尝试加载或保存的设置。
    • 删除 C:\Users(YourUserAccount)\AppData\Local(YourAppName) 文件夹。
    • 确保没有在其中的文件被视为“受阻”。右键单击我的项目所包含的文件,我意识到其中一个图标实际上被阻止并被认为是不好的,因为它是从互联网下载的。我必须点击“解除阻止”按钮(例如,请查看此链接:http://devierkoeden.com/Images/Articles/Dynamicweb/CustomModules/Part1/BlockedFiles.png - “此文件来自另一台计算机,可能已被阻止以帮助保护此计算机。”)。

    0
    我曾多次遇到同样的问题,但两种不同的方法结合使用有所帮助。在所有情况下,一个有趣的事实是,即使文件已经被打开,你仍然可以重命名它。如果一个文件被进程打开,就无法对其进行重命名。因此,这一定不是一个简单的打开文件句柄的问题。
    1. 在编译生成IL代码的解决方案时,即使它只包含几个命令,Defender也完全阻止了它。即使将目录添加到Windows Defender的排除列表中也没有帮助。我认为Windows Defender的病毒扫描存在缺陷,并且如果文件处于某种未完成状态并且阻止该文件,则会进入无限循环(或崩溃?)。但是,除非重新启动PC,否则它永远不会恢复。
    2. 在调试过程中,由于调试器停止按钮无法正常工作,或者可能在使用停止按钮进行常规停止时,我不得不终止我的解决方案后,出现了无法访问的错误。一些dll似乎仍然被锁定,无法删除,但我可以重命名它们(??)。然后我使用'tasklist.exe'列出所有进程,惊讶地发现还有一个进程以我的应用程序名称列出。没有窗口。任务管理器没有在“详细信息”中列出它。奇怪。我可以使用taskkill /PID:... /F(/F是必需的)并且进程消失了。之后编译成功,一切都恢复正常。看起来这个exe以一种奇怪的方式持有了DLL。

    当Oracle VirtualBox也在运行时,这种情况发生得更频繁。不知道这是否有影响。这也可能与“内存不足”异常有关,有时在VirtualBox消耗大量内存时会报告。

    现在每当出现问题时,我同时使用这两种方法。但它仍然偶尔会发生。


    0

    我尝试了你提供的几种解决方案,但偶尔我仍然会收到这个错误。我确定我的进程没有在运行,当我尝试使用Internet Explorer删除可执行文件时,它从文件列表中被移除,但是当我按下F5键时,文件又回来了。它根本没有被删除。

    但是如果我通过TotalCommander删除文件,exe文件就会真正被删除,我可以成功地构建项目。

    我正在使用Windows 7 x64和Total Commander 7.56a 32位。


    0

    终于!是的。这对我也起作用了!不知道为什么一开始它被禁用了。感谢您的答案。我尝试在几周前修复这个问题,但现在又重新看了一下。在此期间一直在使用另一台开发机器。 - ldobson

    0

    我知道这是一个非常老的问题,但最近我在VS 2012中遇到了“无法从obj复制到bin”的错误。每次我尝试重新构建某个项目时,都会收到此消息。唯一的解决方案是在每次重新构建之前进行清理。

    经过多次调查,发现我在其中一个文件中有一个不完整的#pragma warning语句,它没有阻止编译成功,但某种方式会让VS保持文件锁定。

    在我的情况下,我在文件顶部有以下内容:

    #pragma warning(
    

    就是这样。我想我曾经试图做一些事情,但被分心了,从未完成过程,但有关那行代码的VS警告在混乱中丢失了。最终我注意到了警告,删除了该行代码,自那以后每次重建都可以正常工作。


    0

    [已解决] 无法从obj\debug复制exe文件到bin\debug:

    我猜测您在尝试依次运行两个窗体时遇到了此错误,例如首先加载一个窗体,然后过一段时间它会自动消失,第二个窗体加载到屏幕上。

    基本上,您需要关闭在后台运行的第一个窗体,这是此错误的主要原因。

    要关闭第一个窗体,您必须在第二个窗体的加载事件处理程序中添加这两行代码。

            Form1 form = new Form1();
            form.Close();
    

    这将完美地解决错误。


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