【问题标题】:Visual Studio "Could not copy" .... during buildVisual Studio“无法复制”....在构建期间
【发布时间】:2013-08-08 19:09:49
【问题描述】:

我在构建 VS2012 C# 项目期间不断收到此错误

Error   41  Could not copy "obj\Debug\WeinGartner.WeinCad.exe" to
 "bin\Debug\WeinGartner.WeinCad.exe". 
 Exceeded retry count of 10. Failed.    


Error   42  Unable to copy file "obj\Debug\WeinGartner.WeinCad.exe" to
"bin\Debug\WeinGartner.WeinCad.exe". The process cannot access the file
'bin\Debug\WeinGartner.WeinCad.exe' because it is being used by another 
process.    

现在我发现杀死进程

Weingartner.WeinCad.vhost.exe

有效(有时),但这让我很紧张。有什么办法可以完全阻止这种情况的发生?

我的调试器设置是

【问题讨论】:

  • 对我来说,这是由在 Release 目录中手动启动的 .exe 引起的。问题是 VS 无法复制仍在运行的可执行文件。我会尝试通过正确清理资源来修复它,这样程序就不会在窗口关闭按钮后挂起。
  • this question 中有一个很好的总结这个问题的典型步骤来解决
  • 这发生在我身上,因为 Windows Defender 决定它不再喜欢我正在处理的 VS2019 项目中的 .exe。几个星期以来一直在努力解决这个问题,但今天,猜猜一个新的更新不喜欢它。不得不排除我的源文件夹。停止发生。

标签: c# visual-studio-2012 build process


【解决方案1】:

我在 Visual Studio 2013 中遇到过类似的错误消息。

大多数情况下,我发现这种情况发生在调试过程因异常而停止时。

当 clean+build 没有为我解决这个问题时,我通过执行以下操作取得了成功:

  • 关闭 Visual Studio
  • 删除binobj 文件夹,并且
  • 重新打开 Visual Studio。

这个“错误”自 Visual Studio 2003 以来就存在。

最后,我还发现,我通常可以通过简单地重命名可执行文件然后删除它来解决这个问题。

【讨论】:

  • 这里相同,VS2013。退出、删除构建工件、重新启动 -> 一切正常。
  • 我也有同样的问题,但重启 VS 后我得到了一个版本,文件再次被锁定..
  • 这不是解决方案,充其量只是部分解决方案。我不想每 10 分钟重新启动一次 VS。清洁解决方案对我有用,但每 10 分钟清洁一次也不是解决方案。
  • 根据我的经验,无论我在什么机器上开发,VS2013 每天至少为我做 10 次。好像这个bug变得更糟了。只是说'
  • 在 VS 2019 中仍然存在错误。
【解决方案2】:

在 Visual Studio Premium 2013(更新 3)中,我使用预构建单线解决了这个问题:

(if exist "$(TargetDir)*old.pdb" del "$(TargetDir)*old.pdb") & (if exist "$(TargetDir)*.pdb" ren "$(TargetDir)*.pdb" *.old.pdb)

这会优雅地删除所有旧的 PDB 文件(如果可以的话),然后重命名任何带有 .old.pdb 扩展名的文件。一个不错的副作用是,如果旧的 PDB 仍处于锁定状态,它只会在文件名中添加另一个 .old 片段,并且在您下次重新启动 Visual Studio 并进行构建时,它们都会被清除。

例如,构建/调试会话 1 将 MyProject.pdb 锁定。
下次构建时:
MyProject.pdb --> MyProject.old.pdb

然后,构建/调试会话 2 开始,两个 MyProject.pdbMyProject.old.pdb 仍被锁定:
MyProject.old.pdb --> MyProject.old.old.pdb
@987654330 @ --> MyProject.old.pdb

最后,重新启动 Visual Studio 并重新构建将摆脱这两种情况,并像往常一样继续该过程。

【讨论】:

  • VS2010、VS 2012 相同
  • 谢谢您,将您的示例修改为使用 exe 文件,这对我来说非常有效。我认为这也可能是最新的 VS 2015 CTP 中的一个错误。
  • 很高兴它有帮助 - 我仍然设置了预构建命令,它运行良好,以至于我忘记了它在那里!
  • 我讨厌在原则上必须这样做,但它有效,所以就是这样! :) 感谢分享这颗珍珠,杰夫!
  • 最新 (2018-03-11) Visual Studio 2017 v15.6.1:仍然是一个问题。调试,异常,目标目录中的程序集被锁定。上述将 *.pdb 更改为 *.dll 的解决方案仍然适用。
【解决方案3】:

这是因为您已关闭应用程序,但它仍在后台运行。

临时解决方案:

  • 转到任务管理器 (Ctrl + Alt + Esc)。
  • 转到进程选项卡并找到“YourProjectName.exe”。
  • 如果找不到您的进程,请选中“显示所有用户的进程”。
  • 结束处理。

永久解决方案:您必须通过编码关闭您的应用程序。这是代码...

System.Windows.Forms.Application.Exit();

您必须将此代码以所有形式放入表单的关闭事件中。示例:

private void frm_menu_FormClosing(object sender, FormClosingEventArgs e)
{
    System.Windows.Forms.Application.Exit();
}

【讨论】:

  • 就是这样。 Visual Studio 已经崩溃并且 IIS Express 仍在运行(在我的情况下)。我所要做的就是打开任务栏并右键单击 IIS Express 图标并退出。谢谢。
  • 这对我有用;我无法删除 obj 和 bin 文件夹,因为另一个进程正在使用它们。值得庆幸的是,Windows 10 实际上说出了它的名字。一旦它在任务管理器中关闭,问题就消失了
  • 在我这边,它位于用户选项卡上。另外,我使用Process Explorer 找到了它
【解决方案4】:

.vhost.exe 是一个调试器进程,因此被调试的进程似乎没有正确关闭。很有可能您有一个错误使其保持活动状态并且没有正确停止调试过程 - 当您单击“停止调试”而不是实际终止调试器时,可以选择从该过程中分离,所以也许您已经设置好了。

但这就是问题所在 - 您尝试复制的文件已被操作系统锁定(即仍在使用),因此它阻止了复制。确保该文件是免费的并且您可以进行复制。

【讨论】:

  • 我已将调试器选项添加到问题中。我很确定它应该终止进程,但也许我不明白一些选项。
  • Visual Studio 2019 中,我收到了类似的消息,尽管它现在在某些输出(不是全部)中提到了该过程。我必须通过Task Manager 杀死 testhost.x86.exe。之后,它似乎确实停止检测其中一个测试过程。
【解决方案5】:

我已经通过在任务管理器中杀死 IISExpress 解决了这个问题

【讨论】:

    【解决方案6】:

    问题是调试器/构建器创建的可执行文件或库被防病毒软件识别为威胁,因此在执行之前将其删除。

    您最好调整您的防病毒软件,使其不分析您的项目文件夹。


    执行此操作的一些方法(按从优到差的顺序排列)是:

    1. Excluding your project folder from the Anti-Virus
    2. 排除 pdb 文件(不是 100% 保证修复)
    3. 关闭实时保护(不推荐)

    【讨论】:

    • 好收获。我永远讨厌 Avast。
    • Avast 也是我的问题。答案是禁用文件系统屏蔽。我尝试将我的 Visual Studio\Projects 文件夹添加到排除项,但没有奏效。
    • 我在使用 Symantec Endpoint Protection 时遇到了同样的问题。 IT 部门的某个人将安全级别提高到了相当高的水平 :-) 谢谢 Pitrs。
    • 我要补充一点,您可以为 obj\Debug 目录创建异常以方便使用,而不是禁用 AV 或其保护工具之一。
    • 谢谢!我发现这是一个 MalwareBytes 阻止了我的 .exe 文件。
    【解决方案7】:

    我能够通过提供以下预构建操作来解决此问题(VS 2010);

    if exist "$(TargetPath).locked" del "$(TargetPath).locked"
    
    if exist "$(TargetPath)" if not exist "$(TargetPath).locked" move "$(TargetPath)" "$(TargetPath).locked"
    

    【讨论】:

    • @luckyluke,在您的项目属性中,您可以在其中添加预构建脚本的部分。复制并粘贴指定区域中的上述脚本并重建项目/运行您的应用程序
    【解决方案8】:

    引用:

    解决方法是将其放在 >project 的 Pre-build event 命令行属性中(在 build Events 选项卡中):

    代码片段

    if exist "$(TargetPath).locked" del "$(TargetPath).locked"
    
    if exist "$(TargetPath)" if not exist "$(TargetPath).locked" move "$(TargetPath)" "$(TargetPath).locked"
    

    【讨论】:

      【解决方案9】:

      异常

      在 Visual Studio 中的某些情况下,当您 (Build || Rebuild) 在 正在运行 IISExpress 你遇到了这个异常:

      无法复制文件“obj\Debug\YourProjectName.dll”到 bin\YourProjectName.dll”。进程无法访问文件 'bin\YourProjectName.dll' 因为它正在被另一个人使用 进程

      解决方案

      1. 右键单击需要构建的 Web 项目。
      2. 点击属性。
      3. 选择左侧的构建事件选项卡。
      4. 在 Pre-build events 命令行中粘贴以下 2 行:
      tasklist /fi "imagename eq iisexpress.exe" |find ":" > nul
      if errorlevel 1 taskkill /f /im "iisexpress.exe"
      

      你很好2 GO!

      【讨论】:

        【解决方案10】:

        按照以下步骤进行

        1. 打开任务管理器(Ctrl + Alt + Delete)
        2. Performance 选项卡下选择 ProjectNameOfYours.exe>。
        3. 点击结束进程。
        4. 现在构建解决方案。

        以上步骤永久解决了错误:)

        【讨论】:

          【解决方案11】:

          我想我解决了它删除了调试选项中Break all processes when one process breaks 的复选标记(操作的第一个屏幕截图->第二个选项)。
          自从我取消选中它以来,它一直在构建/运行良好。
          我在我的项目中使用 MySql NET 连接器和 DevExpress 控件。可能是其中一个没有很好地处理连接、绑定等,因为这个标志被激活了。

          已编辑:绝对有效!不再有“无法复制文件”和表单设计器错误。

          【讨论】:

          • 其他解决方案都不适合我。这是唯一的一个。我正在使用 Visual Studio 2017 13.2
          • 这总是有效的。我使用 VS2013 社区版。这是我的 17 个项目的解决方案:qurancode.com
          【解决方案12】:

          似乎通过更改项目的程序集名称可以解决问题。

          所以不是这个

          我改成这个

          请注意,我刚刚将其从 Increment and Recall 更改为 Increment_Recall,我只是删除了空格。 我现在可以正常使用了。

          【讨论】:

            【解决方案13】:

            杀死进程 w3wp.exe (IIS) 通常可以解决这个问题。
            通常,您可以通过导航到 bin 文件夹并尝试将其删除来了解锁定文件的进程。如果另一个进程正在使用它,将弹出的错误消息将包含需要终止的进程的名称。

            【讨论】:

              【解决方案14】:

              我的 10 美分贡献。

              我在 VS 2015 Update 2 上偶尔也会遇到这个问题。

              我发现切换编译目标可以解决问题。

              试试这个: 如果您在 DEBUG 中切换到 RELEASE 并构建,然后返回 DEBUG。问题消失了。

              斯特凡诺

              【讨论】:

              • 是的!而已。这是解决这个烦人问题的简单方法!完全为我工作。简单快捷!非常感谢。
              • 它对我有用!提示:使用停用的调试>>选项>>调试>>常规>>“使用托管兼容模式”不需要解决方法!
              【解决方案15】:

              我在 Windows 8 上的 VS 2012 版本 11.0.60610.01 Update 3 上遇到了同样的问题

              没有打开设计器窗口,该项目是一个简单的控制台应用程序。

              访问文件的 vshost 进程的删除在大多数情况下都不起作用,因为该进程没有访问文件。

              行之有效且花费时间最少的最简单解决方法是从解决方案中删除项目,在解决方案中构建另一个项目,然后将原始项目添加回来。

              这是一种刺激和浪费时间,但它是我所知道的所有其他选择中最便宜的。

              希望这会有所帮助...

              【讨论】:

              • 您所要做的就是全部重建,再尝试 10 次就一切正常。没有太大的不便。
              • @Scott Shaw-Smith 对我不起作用。根据我见过的其他一些 cmets,它也不适用于其他人。在我的情况下,卸载 Avast 修复了它。
              【解决方案16】:

              添加主项目 taskkill /f /fi "pid gt 0" /im "YourProcess.vshost.exe" 的预构建事件

              【讨论】:

              • 不是很喜欢用这种方式解决问题,但这很管用!
              • 我发现这是解决该问题的最简单有效的解决方案。
              【解决方案17】:

              如果所有答案都不起作用,请尝试这个简单的检查。 查找任何运行并保存项目 EXE 的 MSbuild.exe。杀死 MSBuild.exe,你应该很高兴。

              【讨论】:

                【解决方案18】:

                我无法提供防止这种情况发生的解决方案,但您至少可以重命名锁定的文件(Windows 资源管理器或经典命令窗口),然后编译/构建。无需重启或重启 VS201x。有了一些经验,您可以添加一个预构建脚本来删除旧文件或重命名,然后以防万一出现锁定。

                【讨论】:

                  【解决方案19】:
                  1. 打开项目属性[菜单>项目>属性]
                  2. 选择“调试”标签
                  3. 取消选中“启用 Visual Studio 托管进程”
                  4. 开始调试 [F5]
                  5. 您将收到安全警告,只是“ok”。让应用程序运行
                  6. 停止调试。
                  7. 在“调试”选项卡下选中“启用 Visual Studio 托管进程”选项,
                  8. 现在,试着开始调试,你不会再看到错误了

                  [为我工作]

                  【讨论】:

                  • 为什么是-2?它也对我有用。它的意义为零,但是嘿,如果它有效,它就有效。
                  • 这是一个永久的解决方案吗?即你每次都必须做这8个步骤吗?
                  • vs17没有托管进程选项
                  【解决方案20】:

                  this other answer。基本上,您可以让 MSBuild.exe 进程在使用资源文件的后台运行。如果您有任何导致 MSBuild 通过命令行启动的构建前或构建后任务,请尝试将“/nr:false”标志添加到此命令。但同样,有关更多具体细节,请参阅上一个答案。

                  【讨论】:

                  • Snap,我在 VS2015 更新 2 中遇到了同样的问题 - 需要在任务管理器中杀死 MSBuild,exe 进程才能重新构建。
                  • 以上 Josh 回答中的文章链接建议使用系统环境变量来禁用 Visual Studio 和 MSBuild 进程中的节点重用 (MSBUILDDISABLENODEREUSE=1) - 这对我有用。
                  【解决方案21】:

                  我终于如何解决它。为什么第一次调试后我们不能继续调试,因为第一个调试的 exe 仍在运行。因此,在第一次调试后,您需要转到任务管理器 -> 进程选项卡 -> [您的项目名称 exe] 结束 exe 进程。

                  它对我有用:)

                  【讨论】:

                  • 哇,谢谢伙计,正是我的问题。因为它在运行 exe 时询问我的用户密码,所以第一次没有触发。当我尝试在进程列表中删除该应用程序然后再次调试时,它完美无缺。
                  【解决方案22】:

                  @Geoff (https://stackoverflow.com/a/25251766/3739540) 的回答很好,但在重新编译时会抛出错误代码 1。

                  这对我有用(2>nul 1>nul 结束 + 出口 0):

                  (if exist "$(TargetDir)*old.pdb" del "$(TargetDir)*old.pdb") & (if exist "$(TargetDir)*.pdb" ren "$(TargetDir)*.pdb" *.old.pdb) 2>nul 1>nul
                  (if exist "$(TargetDir)*old.dll" del "$(TargetDir)*old.dll") & (if exist "$(TargetDir)*.dll" ren "$(TargetDir)*.dll" *.old.dll) 2>nul 1>nul
                  exit 0
                  

                  【讨论】:

                    【解决方案23】:

                    我注意到一些答案可以解决我的问题,但是,以防万一有人遇到与我相同的问题。

                    如果您正在运行控制台应用程序:在您做任何其他事情之前。

                    确保您已关闭任何可能已从先前版本中打开的控制台窗口。例如,我只是在控制台应用程序中测试一些代码,我没有意识到我之前运行我的程序时的控制台窗口是打开的。在我调试的那个会话期间,窗口被推到后面,我看不到它。只是说,这可能是您的问题,因此请检查以确保不是问题所在。

                    【讨论】:

                      【解决方案24】:

                      如果您正在调试 T4 模板,那么这种情况总是会发生。我的解决方案(在 MS 修复此问题之前)只是杀死这个过程:

                      任务管理器 --> 用户 --> T4VSHostProcess.exe

                      此过程仅在您调试 T4 模板时出现,而不是在您运行模板时出现。

                      【讨论】:

                        【解决方案25】:

                        这里有一个脚本可以彻底解决这个问题:

                        REM   This script is invoked before compiling an assembly, and if the target file exist, it moves it to a temporary location
                        REM   The file-move works even if the existing assembly file is currently locked-by/in-use-in any process.
                        REM   This way we can be sure that the compilation won't end up claiming the assembly cannot be erased!
                        
                        echo PreBuildEvents 
                        echo  $(TargetPath) is %1
                        echo  $(TargetFileName) is %2 
                        echo  $(TargetDir) is %3   
                        echo  $(TargetName) is %4
                        
                        set dir=C:\temp\LockedAssemblies
                        
                        if not exist %dir% (mkdir %dir%)
                        
                        REM   delete all assemblies moved not really locked by a process
                        del "%dir%\*" /q
                        
                        REM   assembly file (.exe / .dll) - .pdb file and eventually .xml file (documentation) are concerned
                        REM   use %random% to let coexists several process that hold several versions of locked assemblies
                        if exist "%1"  move "%1" "%dir%\%2.locked.%random%"
                        if exist "%3%4.pdb" move "%3%4.pdb" "%dir%\%4.pdb.locked%random%"
                        if exist "%3%4.xml.locked" del "%dir%\%4.xml.locked%random%"
                        
                        REM Code with Macros
                        REM   if exist "$(TargetPath)"  move "$(TargetPath)" "C:\temp\LockedAssemblies\$(TargetFileName).locked.%random%"
                        REM   if exist "$(TargetDir)$(TargetName).pdb" move "C:\temp\LockedAssemblies\$(TargetName).pdb" "$(TargetDir)$(TargetName).pdb.locked%random%"
                        REM   if exist "$(TargetDir)$(TargetName).xml.locked" del "C:\temp\LockedAssemblies\$(TargetName).xml.locked%random%"
                        
                        REM PreBuildEvent code
                        REM   $(SolutionDir)\BuildProcess\PreBuildEvents.bat  "$(TargetPath)"  "$(TargetFileName)"  "$(TargetDir)"  "$(TargetName)"
                        
                        REM References:
                        REM   http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx
                        REM   http://stackoverflow.com/a/2738456/27194
                        REM   http://stackoverflow.com/a/35800302/27194
                        

                        脚本需要从每个 VS 项目预构建事件中调用。

                        $(SolutionDir)\BuildProcess\PreBuildEvents.bat  "$(TargetPath)"  "$(TargetFileName)"  "$(TargetDir)"  "$(TargetName)"
                        

                        【讨论】:

                          【解决方案26】:

                          您可以通过脚本杀死应用程序。

                          如果您的应用程序名为 myapp.exe,请在终端中运行下一个脚本:

                          taskkill /IM myapp.exe /F
                          

                          参数为:

                          /IM   application name (imagename)
                          
                           /F                     Specifies to forcefully terminate the process(es).
                          

                          【讨论】:

                            【解决方案27】:

                            在我的例子中,它是 Resharper 单元测试运行器(加上 NUnit 测试,MsTests 从来没有这样的问题)。杀死进程后,能够重建进程,无需重新启动操作系统或 VS2013。

                            其他测试运行程序,例如 xUnit 可能会导致同样的问题。

                            然后检查您是否可以添加 Dispose 模式有帮助,例如,如果您要添加 DbFixture 并且数据库联系人未正确处理。即使测试完成,这也会导致程序集文件被锁定。

                            注意,您可以将 IDisposable 接口添加到您的 DbFixture 并让 IntelliSense 添加 Dispose 模式。然后,释放相关的包含属性并将它们显式分配给 null。

                            这将有助于以干净的方式结束测试并在测试结束后立即解锁相关的锁定文件。

                            示例(xUnit 测试使用 DBFixture):

                            public class DbFixture: IDisposable
                            {
                                private bool disposedValue;
                                public ServiceProvider ServiceProvider { get; private set; }
                                
                                public DbFixture()
                                {
                                    // initializes ServiceProvider
                                }
                                
                                
                                protected virtual void Dispose(bool disposing)
                                {
                                    if (!disposedValue)
                                    {
                                        if (disposing)
                                        {
                                            // dispose managed state (managed objects)
                                            ServiceProvider.Dispose();
                                            ServiceProvider = null;
                                        }
                            
                                        // TODO: free unmanaged resources (unmanaged objects) and override finalizer
                                        // TODO: set large fields to null
                                        disposedValue = true;
                                    }
                                }
                            
                                // // TODO: override finalizer only if 'Dispose(bool disposing)' has code to free unmanaged resources
                                // ~DbFixture()
                                // {
                                //     // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
                                //     Dispose(disposing: false);
                                // }
                            
                                public void Dispose()
                                {
                                    // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
                                    Dispose(disposing: true);
                                    GC.SuppressFinalize(this);
                                }
                            }
                            

                            测试类本身需要相同的模式 - 它需要自己的 Dispose 方法(如上面的 DbFixture 类所示):

                               public SQL_Tests(ITestOutputHelper output)
                                {
                                    this.Output = output;
                                    var fixture = new DbFixture(); // NOTE: MS Dependency injection framework didn't initialize when the fixture was a constructor param, hence it is here
                                    _serviceProvider = fixture.ServiceProvider;
                                } // method
                            

                            所以它需要在自己的Dispose方法中dispose它的本地属性_serviceProvider,因为测试类构造函数SQL_Tests实例化了它。

                            【讨论】:

                            • 是的,找JetBrains.Resharper.TaskRunner.*
                            • 您的想法是对的,我根据我使用 xUnit 的经验添加了一些内容,因为这个问题耗费了我很多时间并且不容易解决……希望对您有所帮助。
                            【解决方案28】:

                            这个问题是查找以下错误时的第一个结果:

                            无法复制文件“...”,因为找不到它。

                            在 Visual Studio 2013(更新 3)中构建时。

                            解决方案:卸载 Visual Studio 2013 中的“Productivity Power Tools”。

                            https://connect.microsoft.com/VisualStudio/feedback/details/533411

                            【讨论】:

                            • 在构建从 TFS 继承的项目时多次收到此错误。以为就是这样!在已安装的程序和加载项中搜索此内容。找不到此电动工具应用程序。这会藏在哪里?
                            【解决方案29】:

                            我没有意识到我仍然连接着我的调试器并试图在同一个 Visual Studio 实例中构建。一旦我停止调试器,我就能够构建。

                            【讨论】:

                              【解决方案30】:

                              杀死 vstest.executionengine.exe 进程可以在 90% 的情况下为我解决此问题。如果这不起作用,那么也可以杀死 QTAgent32.exe,然后删除相关项目的 /bin 和 /obj 文件夹。

                              这是我工作日中最烦人的部分。 :)

                              【讨论】:

                                猜你喜欢
                                • 2017-04-25
                                • 1970-01-01
                                • 1970-01-01
                                • 2021-11-30
                                • 2012-10-24
                                • 2015-12-05
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多