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

vomnis 发布于 2019-03-29 build 最后更新 2019-03-29 14:22 128 浏览

在构建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
作品(有时),但这让我感到紧张。有什么办法阻止这种情况发生? 我的调试器设置是 enter image description here enter image description here
已邀请:

kautem

赞同来自:

这是因为你已经关闭了你的应用程序,但它仍然在后台运行。 临时解决方案:

  • 转到任务管理器( Ctrl + Alt + Esc )。
  • 转到进程选项卡,找到“YourProjectName.exe”。
  • 结束处理它。
永久解决方案:您必须通过编码关闭您的应用程序。这是代码......
System.Windows.Forms.Application.Exit();
您必须将此代码以所有形式放入表单的结束事件中。例:
private void frm_menu_FormClosing(object sender, FormClosingEventArgs e)
{
    System.Windows.Forms.Application.Exit();
}

lut

赞同来自:

您应该禁用您的防病毒软件(特别是如果它是Avast)并再试一次。它帮助了我。问题是调试器/构建器会创建由Avast识别为威胁的.exe文件,因此在VS可以执行之前将其删除。

nfugit

赞同来自:

重置IIS,停止使用您的DLL(可能是控制台应用程序或Windows服务托管应用程序或IIS)的服务,然后尝试。 它对我有用。

cnon

赞同来自:

异常 在某些情况下,在Visual Studio中(构建||重建)时 运行IISExpress你面临这个例外:
Unable to copy file "obj\Debug\YourProjectName.dll" to bin\YourProjectName.dll". the process cannot access the file 'bin\YourProjectName.dll' because it is being used by another process

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

sesse

赞同来自:

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

fdolor

赞同来自:

我注意到一些解决了我的问题的答案,但是,万一有人遇到同样的问题。 如果你正在运行一个控制台应用程序:在你做任何事情之前。 确保已关闭可能已从先前版本打开的任何控制台窗口。例如,我只是在控制台应用程序中测试一些代码,我没有意识到以前我运行程序之一的控制台窗口是打开的。在那个会话期间我正在调试,窗口被推到后面,我看不到它。只是说,这可能是你的问题,所以检查以确保这不是问题。

iodit

赞同来自:

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

gautem

赞同来自:

转到工具>>选项>>数据库工具>>常规 检查Sqript / Query Execution

tiure

赞同来自:

最快的方法是更改​​Build配置类型并再次返回到先前的配置。

tvelit

赞同来自:

尝试构建主WinForms(XAF)项目时,我遇到了错误消息。我只能执行一次应用程序,然后关闭VS2015 IDE并重新启动才能执行重建。在项目的属性页面中进行一些挖掘后 - 在“debug”属性页中,选中了一个复选框 - 启用Visual Studio Hosting Process。我取消选中并重新启动IDE,应用程序现在正在构建 - “无法复制{project} .exe”消息。 What is the purpose of the Visual Studio Hosting Process?

sit_et

赞同来自:

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

Could not copy the file "..." because it was not found.
在Visual Studio 2013(Update 3)中构建时。 解决方案:在Visual Studio 2013中卸载“Productivity Power Tools”。 https://connect.microsoft.com/VisualStudio/feedback/details/533411

zvelit

赞同来自:

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

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

cvelit

赞同来自:

似乎通过更改项目的程序集名称可以解决问题。 所以不要这样 enter image description here 我把它改成了这个 enter image description here 请注意,我刚将其从Increment and Recall更改为Increment_Recall,我刚删除了这些空格。它现在对我很好。

lnulla

赞同来自:

在我的情况下,文件VS coulnd't copy是.Task项目的文件,所以问题是我有一些在本地运行的计划任务。一旦我停下来并禁用它们,复制问题就消失了。

uid

赞同来自:

我在Windows 8上的VS 2012版本11.0.60610.01更新3上遇到了同样的问题 没有打开设计器窗口,项目是一个简单的控制台应用程序。 由于进程未访问该文件,因此删除访问该文件的vshost进程大多数时间都不起作用。 工作且花费最少时间的最简单的解决方法是从解决方案中删除项目,在解决方案中构建另一个项目,然后添加原始项目。 这是一种刺激和浪费时间,但它是我所知道的所有其他选项中最便宜的。 希望这可以帮助...

ddolor

赞同来自:

我10美分的贡献。 我在VS 2015 Update 2上偶尔会遇到这个问题。 我发现切换编译目标解决了这个问题。 尝试这个: 如果您在DEBUG中切换到RELEASE并构建,则返回DEBUG。问题消失了。 斯特凡诺

hipsum

赞同来自:

我在VS 2015中遇到了这个问题。我的环境的原因是使用StyleCopAdditionalPaths的StyleCop项目设置Include =“...”来指定其他StyleCop Addin路径。我使用的解决方法是从.csproj文件中删除此项目设置,而是手动复制StyleCop AddIn,其中存在StyleCop.CSharp.Rules.dll。不是一个优雅的解决方案,但我发现解决方案在执行此操作后从未锁定dll。

baut

赞同来自:

在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并进行全新构建将摆脱这两者,并像往常一样继续该过程。

kqui

赞同来自:

删除Bin文件夹内Debug或Release文件夹下的任何.cache文件。

ret

赞同来自:

就我而言,Visual Studio 2105远程调试器就是问题所在。当我在任务管理器中杀死此任务时,我能够在Visual Studio中成功重建我的应用程序。

modit

赞同来自:

的(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

ysit

赞同来自:

使用DNN。我通过编辑MSBuild.Community.Tasks.Targets文件并更改bin路径来解决了这个问题:

<MSBuildDnnBinPath Condition="'$(MSBuildDnnBinPath)' == ''">$(MSBuildProjectDirectory)\bin</MSBuildDnnBinPath>

dipsam

赞同来自:

使用

Debug.Flush();
Debug.Close();
万一发生异常,在catch或finally块中。 编辑: 我亲自面对这个问题,我经常做一个技巧,它工作正常。 我将构建类型从“debug”更改为“release”(如果已经存在,则将“release”更改为“debug”)。

cnon

赞同来自:

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

aet

赞同来自:

如果我使用VS2012编辑WP8上的Xaml页面,我每次部署都会得到这个。 我需要不打开Xaml页面或使用进程资源管理器来终止进程XDesProc.exe。 如果您收到此错误,那么我建议您使用进程资源管理器查看正在发生的情况(即使这是一个不同的问题)。只需找到进程“WeinGartner.WeinCad.exe”,它应该显示进程和句柄访问文件(至少在杀死vhost文件时没有解决问题)。

hhic

赞同来自:

检查任务管理器以查找运行.exe的任何进程

xnam

赞同来自:

花了几个小时试图解决这个问题,然后发现我正在开发一项服务 - 记得停止任何服务作为解决方案的一部分!

bquia

赞同来自:

将其添加到预建:

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

dquis

赞同来自:

我在VS 2013中遇到了错误消息。
当调试过程在异常中的某个地方停止时,通常会发生这种情况 当clean + build没有效果时,关闭VS,删除'bin'和'obj'文件夹再次打开VS直到现在总能解决问题。 自VS2003以来该错误存在。 另外:通常可以重命名文件,然后您可以删除它。

cnisi

赞同来自:

我遇到了同样的问题,我在这里提到了很多不同的方法但是没有一个能为我工作,这对我来说是唯一有效的解决方案:

  1. 从我的解决方案的DEBUG文件夹中删除READ ONLY属性
  2. 将此添加到构建事件:如果存在“$(TargetPath).locked”del“$(TargetPath).locked” 如果不存在“$(TargetPath).locked”如果存在“$(TargetPath)”移动“$(TargetPath)”“$(TargetPath).locked”

uet

赞同来自:

对我来说,Avast防病毒软件不会让visual studio写入/读取/执行文件。所以我不得不将Visual Studio 2010/2012文件夹添加到防病毒排除列表中。就在那之后......它有效。

khic

赞同来自:

我也碰到了这个。事实证明,我一直在使用我自己构建的服务进行测试,该服务正在耗尽我解决方案中某个项目的.. \ bin \ release目录。我已经运行了服务,但在返回测试之前我忘了停止/卸载它。结果,它保留了我引用的一个dll,并且需要从一个项目的bin / release子文件夹移动(自动作为依赖项)到另一个。停止服务解决了问题。

nquis

赞同来自:

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

lut

赞同来自:

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

asaepe

赞同来自:

我通过在任务管理器中杀死IISExpress来解决它

bsit

赞同来自:

我想我解决了它删除了调试选项中Break all processes when one process breaks的复选标记(op的第一个截图 - >第二个选项)。
由于我取消选中它,它已经建立/运行了一段时间。
我在我的项目中使用MySql NET Connector和DevExpress控件。可能是其中一个没有处理连接,绑定等,因为这个标志beeing激活。 编辑:绝对有效!不再“无法复制文件”,也没有更多表单设计器错误。

lillo

赞同来自:

在我的例子中,它是Resharper Unit Tests的跑步者(加上NUnit测试,从未遇到MsTests的这样的问题)。杀死进程后,能够重建进程,无需重启OS或VS2013

qporro

赞同来自:

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

fearum

赞同来自:

引用:

A workaround is to put this in the Pre-build event command line property of the >project (In the build Events tab):
代码片段
if exist "$(TargetPath).locked" del "$(TargetPath).locked"
if exist "$(TargetPath)" if not exist "$(TargetPath).locked" move "$(TargetPath)" "$(TargetPath).locked"

cut

赞同来自:

我疯了,试图找到为什么System进程在我终止后的另一分钟工作的EXE上保持打开状态,我得到了与OP相同的错误。 原因是之前的开发人员没有在using(){}中包装IDisposable对象。一旦IDisposable对象正确地自行销毁,就不会再发生错误,我可以立即重建。

id_aut

赞同来自:

在使用IL Support插件时发生了这种情况。 如果项目中没有任何IL文件(例如,因为您删除了最后一个文件),则构建将失败,如问题中所述。 删除IL的支持解决了这个问题

tut

赞同来自:

解决方案:重新启动操作系统,它总是适合我,因为vshost进程有时无法结束。 VS系列版本中也存在此错误,包括VS2013。 您可以参考链接:http://connect.microsoft.com/VisualStudio/feedback/details/533411

esaepe

赞同来自:

就我而言(Windows 10,Visual Studio 2015): 任务管理器 - >用户 - > EndTask => vshost.exe (它立即重启,你可以再次构建)

nnihil

赞同来自:

另一个kludge,呃,但它很容易在VS 2013中适用于我。点击该项目。在属性面板中,应该是一个名为Project File的条目,其值为 (您的项目名称).vbproj 更改项目名称 - 例如在末尾添加-01。锁定的原始.zip文件仍然存在,但不再引用...因此您的工作可以继续。下次重新启动计算机时,该锁定会消失,您可以删除错误文件。

xsed

赞同来自:

我也定期在Visual Studio 2010中遇到此问题。关闭Visual Studio,删除binobj目录,然后重新启动将修复一个版本。然后问题又回来了。我在这个帖子上尝试了其他所有答案,但没有一个对我有用。对我来说永久解决这个问题的唯一方法就是转到项目设置并关闭“启用Visual Studio托管过程”,构建,重新打开它,然后重新构建。

raut

赞同来自:

如果您正在调试T4模板,那么这种情况一直都在发生。我的解决方案(在MS修复此问题之前)只是为了杀死这个过程: 任务管理器 - >用户 - > T4VSHostProcess.exe 此过程仅在调试T4模板时出现,而不是在运行T4模板时出现。

quo_et

赞同来自:

我意识到这只是为这个问题增加了已经很多的答案,但是我认为值得一提的是,虽然并不完美,但是@Stefano,@ MichaelRibbons和@IvanFerrerVilla提供的答案的组合提供了一个不错的位置成功的时候,他们自己都不是很成功。

eet

赞同来自:

这是一个绝对摆脱这个问题的脚本:

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)"
enter image description here

ret

赞同来自:

杀死vstest.executionengine.exe进程可以在90%的时间内解决此问题。如果这不起作用,那么还要杀死QTAgent32.exe,然后删除有问题的项目的/ bin和/ obj文件夹。 这是我工作日最烦人的部分。 :)

eut

赞同来自:

确保关闭所有wcfSvcHost实例,然后重试。 它对我有用!

avelit

赞同来自:

.vhost.exe是一个调试程序进程,因此看起来正在调试的进程没有正确关闭。有可能你有一个让它保持活着并且没有正确停止调试过程的错误 - 当你点击'停止调试'而不是实际杀死调试器时,有一些选项可以从进程中分离出来,所以也许你有这个设置。 但这就是问题 - 您尝试复制的文件被操作系统锁定(即仍在使用),因此它会阻止复制。确保该文件是免费的,您将能够复制。

faut

赞同来自:

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