Visual Studio“无法复制”…在构建过程中


347

在我的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无法复制仍在运行的可执行文件。我将尝试通过正确清理资源来修复它,以使程序在关闭窗口按钮后不会挂起。
lahjaton_j

出现这个问题,在典型的步骤来解决的一个很好的总结了这个问题
LightCC

这是因为我的Windows Defender决定不再喜欢我正在使用的VS2019项目中的.exe。已经进行了数周的工作,但没有任何问题,但是今天,猜想有一个新的更新不喜欢它。必须排除我的源文件夹。停止发生。
IronRod

Answers:


401

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

通常,我发现,由于异常而停止调试过程时,会发生这种情况。

当clean + build无法为我解决此问题时,请执行以下操作以取得成功:

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

自Visual Studio 2003以来,此“错误”一直存在。

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


8
VS2013也一样。退出,删除构建工件,重新启动->一切正常。
cacau 2014年

49
我有同样的问题,但是在重新启动VS之后,我得到了一个版本,并且文件再次被锁定..
Sonic Soul

54
这不是解决方案,最好是部分解决方案。我不想每10分钟重新启动VS。清洁溶液对我有用,但是每10分钟清洁一次也不是解决方案。
Legends

7
根据我的经验,VS2013每天至少要为我执行10次此操作,而不管我使用的是哪种计算机。就像错误变得更糟了。只是说说而已
AR

28
错误仍然在2019年VS存在
阿卡什KC

107

在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
MyProject.pdb- >MyProject.old.pdb

最后,重新启动Visual Studio并进行全新的构建将消除这两个问题,并照常继续该过程。


5
VS2010和VS 2012中的情况相同
Boogier 2015年

7
谢谢,对我来说非常完美,可以将示例修改为使用exe文件。我认为这也可能是最新VS 2015 CTP中的错误。
Johny Skovdal

很高兴它提供了帮助-我仍然设置了预构建命令,并且它运行良好,以至于我忘了它在那儿!
Geoff 2015年

3
我讨厌必须在主体上执行此操作,但是它可以正常工作,因此!:)感谢您分享这颗明珠,Geoff!
kayleeFrye_onDeck

1
最新(2018-03-11)Visual Studio 2017 v15.6.1:仍然是一个问题。目标目录中的调试,异常,程序集已锁定。* .pdb更改为* .dll的上述解决方案仍然适用。
米歇尔·德·沃尔德

71

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

临时解决方案:

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

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

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

您必须将该代码放入所有表单的关闭事件中。例:

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

1
就是这样 Visual Studio崩溃了,并且IIS Express仍在运行(以我为例)。我要做的就是打开任务栏,右键单击IIS Express图标并退出。谢谢。
—尼克·威尔逊

这对我有用;我无法删除obj和bin文件夹,因为另一个进程正在使用它们。幸运的是,Windows 10实际上说出了它的名字。一旦在任务管理器中关闭,问题就消失了
Novastorm '18

25

.vhost.exe是一个调试器进程,因此似乎正在调试的进程没有正确关闭。您可能有一个使它保持活动状态并且没有正确停止调试过程的错误-单击“停止调试”而不是实际上杀死调试器时,有一些选项可以从该过程中分离出来,所以也许您有相应的设置。

但这就是问题-您试图复制的文件已被操作系统锁定(即仍在使用),因此阻止了复制。确保该文件是免费的,并且您将能够复制。


我已将调试器选项添加到问题中。我很确定它应该终止进程,但是也许我不明白某些选择。
bradgonesurfing

在中Visual Studio 2019,我得到了类似的消息,尽管现在它在某些输出(不是全部)中提到了该过程。我必须通过testhost.x86.exe杀死它Task Manager。之后,它似乎确实停止检测其中一种测试过程。
安德斯


20

您应该禁用防病毒软件(特别是如果是Avast),然后重试。它帮助了我。问题在于,调试器/生成器会创建一个被Avast识别为威胁的.exe文件,因此在VS执行该文件之前就将其删除。


接得好。我永远讨厌Avast。
stackunderflow

Avast也是我的问题。答案是禁用文件系统防护。我尝试将我的Visual Studio \ Projects文件夹添加到“排除项”中,但这没有用。
KeithB 2014年

1
我对Symantec Endpoint Protection有同样的问题。IT部门的某个人已经提高了安全级别:-)感谢Pitrs。
ssimm '16

我要补充一点,您可以为obj \ Debug目录创建例外以方便使用,而不是禁用AV或其保护工具之一。
卡利

谢谢!我发现这是阻止我的.exe文件的MalwareBytes。
NL3294 '17

15

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

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

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

1
@luckyluke,在项目属性中,您可以在其中添加预构建脚本的部分。将上述脚本复制并粘贴到指定区域,然后重建项目/运行您的应用程序
Nair

13

引用:

一种解决方法是将其放在> 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"

8

例外

在Visual Studio中的某些情况下,当您在运行 IISExpress 时(生成||重建)时, 会遇到此异常:

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

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

你是2 GO!


6

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

所以代替这个

在此处输入图片说明

我改成这个

在此处输入图片说明

注意,我只是将其从更改Increment and RecallIncrement_Recall,我只是删除了空格。现在对我来说很好。


伟大的解决了我的问题。谢谢!
Kiran Joshi

6

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


4

我在Windows 8上的VS 2012版本11.0.60610.01更新3上遇到了相同的问题

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

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

可行且耗时最少的最简单的解决方法是从解决方案中删除项目,在解决方案中构建另一个项目,然后再添加原始项目。

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

希望这可以帮助...


您所要做的就是全部重建,一切都可以再进行10次尝试。带来的不便不多。
Scott Shaw-Smith

@Scott Shaw-Smith对我不起作用。根据我所看到的其他一些评论,它对其他人也无效。就我而言,卸载Avast可以解决此问题。
user316117 2015年

4

我想我解决了它,删除了Break all processes when one process breaksDebug选项(op的第一个屏幕截图->第二个选项)中的复选标记。
自从我取消选中以来,它一直在良好地构建/运行。
我在项目中使用MySql NET Connector和DevExpress控件。由于此标志蜂鸣已激活,可能是其中之一未很好地处理连接,绑定等问题。

编辑:绝对有效!没有更多的“无法复制文件”,没有更多的表单设计器错误。


1
没有其他解决方案对我有用。这是唯一的。我正在使用Visual Studio 2017 13.2
xleon

1
刚刚在VS2019中测试过,对我不起作用
0xBADF00D

4

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


并不是很喜欢以这种方式解决问题,但这确实有效!
皮特·T

我发现这是解决该问题的最简单的解决方案。
dscharge

4

我的10美分捐款。

偶尔在VS 2015 Update 2上仍然存在此问题。

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

尝试以下操作:如果您在DEBUG中,请切换到RELEASE并进行构建,然后再回到DEBUG。问题解决了。

斯特凡诺


是的 而已。这是解决这个烦人问题的简单方法!完全为我工作。简单快捷!非常感谢。
Meister Schnitzel

1
这个对我有用!提示:如果停用了Debug >> Options >> Debugging >> General >>“ Use Managed Compatibility Mode”,则不需要解决方法!
leon22 '18

4

请按照以下步骤

  1. 打开任务管理器(Ctrl + Alt + Delete)
  2. 在“ 性能”选项卡下,选择“ < ProjectNameOfYours.exe”
  3. 单击结束进程。
  4. 现在构建解决方案。

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


3

如果没有答案,请尝试进行此简单检查。查找所有运行并保存您的项目EXE的MSbuild.exe。杀死MSBuild.exe,您应该会很好。


2

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


2

看到其他答案。基本上,您可以在消耗后台资源的文件中运行MSBuild.exe进程。如果您有任何通过命令行启动MSBuild的构建前或构建后任务,请尝试在此命令中添加“ / nr:false”标志。但是同样,请参见前面的答案以获取更多具体细节。


Snap,我在VS2015更新2中有同样的问题-MSBuild,exe进程需要在TaskManager中终止才能重新构建。
Nick Wright

以上Josh答案中的文章链接建议使用系统环境变量来禁用Visual Studio和MSBuild进程内的节点重用(MSBUILDDISABLENODEREUSE = 1)-这对我有用。
Nick Wright

2

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

这个对我有用 :)


哇,谢谢,我的问题正好 由于它在运行exe时要求我输入用户密码,因此第一次没有触发。当我尝试在进程列表中删除该应用程序然后再次调试时,它可以正常工作。
Chandraprakash

2

@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

2

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

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

仅在调试T4模板时才会执行此过程,而在运行模板时则不会。


2

这是一个绝对可以消除此问题的脚本:

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)"

在此处输入图片说明


2
  1. 打开项目属性[菜单>项目>属性]
  2. 选择“调试”标签
  3. 取消选中“启用Visual Studio托管过程”
  4. 开始调试[F5]
  5. 您将收到安全警告,只需“确定”即可。让应用程序运行
  6. 停止调试。
  7. 在“调试”标签下,选中“启用Visual Studio托管过程”选项,
  8. 现在,尝试开始调试,您将不再看到错误

[为我工作]


为什么是-2?它也为我工作。它是零意义的,但是嘿,如果它起作用了,那就起作用了。
Wakka02 '02

这是一个永久解决方案吗?也就是说,您是否每次都要执行这8个步骤?
亚瑟·史瓦斯

vs17没有托管过程选项
John Demetriou

1

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

由于找不到文件“ ...”,因此无法复制。

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

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

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


在从TFS继承的项目的构建中多次发生此错误。以为是这样!在已安装的程序和加载项中搜索此内容。找不到此电动工具应用程序。这个藏在哪里?
Taersious

1

在我的情况下,它是Resharper单元测试运行程序(加上NUnit测试,MsTests从来没有这样的问题)。杀死进程后,能够重建进程,而无需重新启动OS或VS2013


是的,寻找JetBrains.Resharper.TaskRunner.*
Dunc

1

我没有意识到我仍然附加了调试器,并试图在同一Visual Studio实例中进行构建。一旦我停止调试器,我就可以构建。


1

杀死vstest.executionengine.exe进程可以为我90%的时间解决此问题。如果这不起作用,则还可以杀死QTAgent32.exe,然后删除所涉及项目的/ bin和/ obj文件夹。

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


1

对我来说,是Avast防病毒软件不允许Visual Studio写入/读取/执行文件。因此,我必须将Visual Studio 2010/2012文件夹添加到防病毒排除列表中。在那场灾难之后...它起作用了。


1

确保关闭所有实例wcfSvcHost,然后重试。它为我工作!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.