Visual Studio在构build时locking输出文件

我在VS 2010中有一个简单的WinForms解决scheme。每当我构build它时,输出文件(bin \ debug \ app.exe)最终locking,并且随后的编译失败,并显示"The process cannot access the file 'bin\Debug\app.exe' because it is being used by another process." 构build这个项目的唯一方法是在每次构build之后重新启动VS,这非常尴尬。

我发现这个旧的博客文章http://blogs.geekdojo.net/brian/archive/2006/02/17/VS2005FileLocking.aspx – 这似乎是问题是真的老了。 有没有人知道这里发生了什么,或者至less有一些解决方法?

更新

我实际上没有运行该文件。 编译后发生locking,而不是在debugging后(即启动VS – 构build – 构build – 失败!)我试图closures防病毒。 这没有帮助。

更新2

Process Explorer显示devenv.exe加载了文件(在DLL中,不在句柄中)。 这似乎是在构build过程中的一些小故障阻止卸载,但(第一)build设完成没有任何消息,然后“1成功,o失败”/

有同样的问题,但find了解决scheme(感谢Keyvan Nayyeri ):

但是如何解决呢? 根据你的项目types有不同的方法,但我build议Visual Studio插件开发人员的一个简单的解决scheme是添加一个简单的代码到他们的项目的构build事件。

您可以将以下代码行添加到项目的预生成事件命令行中。

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

这不是一个病毒问题。 这是visual studio 2010的bug。 这个问题似乎与使用视觉工作室gui designer有关。

这里的解决方法是将locking的输出文件移动到预生成事件中的另一个临时文件中。 随机生成临时文件名是有意义的。

 del "$(TargetPath).locked.*" /q if exist "$(TargetPath)" move "$(TargetPath)" "$(TargetPath).locked.%random%" exit /B 0 

在使用常量临时文件名的情况下,您只会推迟locking:

该解决方法只能运行一次

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

我也find了2个临时文件的解决scheme,它的工作原理是2次。

这个问题也发生在我身上。

我的情况是这样的:运行Windows 7(但也可能发生在Windows XP中),并在使用WPF用户控件的项目上工作时,我可以build立所有的时间,直到打开用户控件的XAML文件 – 从那里,有一个版本,然后文件被locking。

另外,我注意到我以pipe理员身份运行Visual Studio(Devenv.exe), 我已经开始运行没有pipe理员权限的Visual Studio,问题就没有了!

让我知道,如果它也帮助你。 祝你好运。

我在一个贪婪的病毒扫描软件上看到了这个,或者app.exe没有正确closures。 确保该过程没有运行。

那么你的机器上的病毒扫描器呢? 你可以看到任何正在持有处理文件的进程 (使用Process Explorer来查找)?

也许在进程列表中可以看到“app.exe”,即你debugging的最后一个版本还在运行? 当您开发具有多个线程的应用程序时,如果您不join所有这些应用程序,可能会发生这种情况。

我有同样的问题,我发现,VS只locking的exe时,我打开一个窗体或用户控件在VS之前,build设。 解决scheme非常简单,我只需在构build解决scheme之前closures任何Form / UserControl,然后运行。

还有一个已知问题533411自动更新内部版本号的使用可能导致locking问题。 来自bug报告的解决方法

临时解决方法是在重build后禁用程序集版本更新。 在AssemblyInfo.cs文件中,从AssemblyVersion属性中删除通配符,例如:
取代这个:
[汇编:AssemblyVersion(“1.4。*”)]
[汇编:AssemblyFileVersion(“1.4”)]
有了这个:
[assembly:AssemblyVersion(“1.4.0.0”)]
[汇编:AssemblyFileVersion(“1.4.0.0”)]

我有这个问题,并解决了一些自定义代码。 在这里看到: Visual Studio 2010构build文件locking问题

在接受的答案中编译实用程序,并在构build步骤中引用它以解决问题。 我仍然在午餐时关掉VS 2010来清理早上的工作。

自定义代码的原因是,经常推荐的解决scheme只能工作一次,然后重命名的文件也被locking,防止重命名。 在这里,我们只是将数据时间信息附加到文件中,以使重命名的版本不会发生冲突。

基于伟大的Stormenet答案 ,我build立了一个应该在任何情况下工作的小脚本。

这里是放置在预生成事件文本框中的代码

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

预建事件

这里是脚本复制文件$(SolutionDir)\BuildProcess\PreBuildEvents.bat (当然你可以修改这个path):

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

唯一对我有用的是退出Visual Studio 2012,删除有问题的项目的BIN和OBJ文件夹,并再次打开Visual Studio。

问题解决了…直到下一次。

如果你的$(TargetPath)指向一个使用COM的DLL,确保你有一个默认的构造函数。 不知道为什么默认构造函数不是在那里推断的。 在这种情况下添加默认构造函数为我工作。

closures视觉工作室,重新打开和重新加载最新的解决scheme为我解决这个问题。 (Visual Studio 2013旗舰版)

我遇到了VS2017中开发xamarin应用程序的相同的事情。

这恰好是Windows Defenderlocking与devenv.exe EXE / DLL。

你可以去Win Defender并添加

 devenv.exe msbuild.exe 

到进程排除列表。

这是我find的解决scheme

  1. 在项目设置中取消选中Visual Studio宿主进程,如下所示

在这里输入图像说明

  1. 杀死exe。 它将是taskmanager的applicationname.vshost.exe

在这里输入图像说明

  1. 现在你可以重build你的应用程序并运行。

注意:您可以重新启用此选项,而不会有任何问题。

我设法通过禁用McAfee LiveSafe实时扫描来解决此问题。 我的.exe文件会像OP所描述的那样locking,我无法删除文件,这意味着我无法构build解决scheme。 禁用McAfeefunction后,问题消失了。

然后,我当然继续完全卸载迈克菲,这是只安装,因为我的电脑是新的,它随着程序已经安装。

我创build了一个新的空白解决scheme,并添加了所有的旧文件。 这不知何故解决了这个问题。