Visual Studio在生成时锁定输出文件


80

我在VS 2010中有一个简单的WinForms解决方案。每当构建它时,输出文件(bin \ debug \ app.exe)最终都会被锁定,随后的构建会失败,并显示以下消息 "The process cannot access the file 'bin\Debug\app.exe' because it is being used by another process." :唯一的构建项目的方法是在之后重新启动VS。每一个版本,这都很尴尬。

我发现了这个旧博客帖子http://blogs.geekdojo.net/brian/archive/2006/02/17/VS2005FileLocking.aspx-看来问题确实很老。有谁知道这里发生了什么,或者至少有一些解决方法?

更新资料

我实际上没有运行该文件。锁定发生在构建之后,而不是在调试之后(即,启动VS-构建-构建-失败!),然后尝试关闭防病毒软件。它没有帮助。

更新2

进程浏览器显示devenv.exe已加载文件(在DLL中,而不是在Handles中)。似乎在构建过程中出现一些故障阻止了卸载,但是(第一个)构建已完成,没有任何其他消息,除了“ 1成功,失败” /


偶尔我也有类似的问题;您使用Windows 7吗?就我而言,这不是VS锁定文件:我可以在资源管理器中将其删除,并且构建运行良好。我注意到如果在输出目录上打开资源管理器窗口,则该问题会更频繁地发生。不使用病毒扫描程序。
stijn 2010年

使用NUnit时,在Win7上有时会出现相同的问题,这在执行某些TDD时非常烦人。
Mathias

@stijn:不使用按需访问的病毒扫描程序吗?oo ...
TheBlastOne 2011年

当我调试单元测试并在VS完成测试执行之前停止代码时,VS 2013也会发生这种情况。如果我多花几秒钟让VS卸载测试运行程序,则不会发生。
StingyJack 2015年

Answers:


69

遇到了同样的问题,但是找到了解决方案(感谢 Keyvan Nayyeri):

但是如何解决呢?有多种方法可以使用,具体取决于您的项目类型,但是我向Visual Studio外接程序开发人员推荐的一种简单解决方案是,向其项目的构建事件添加简单的代码。

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

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

也为我工作。现在有这个问题了。
ritcoder

这对我有用。我按照下面的Vladimir Datsyuk尝试了此版本的%random%版本,但是发现在我的情况下,唯一被锁定的文件是从启动VS之后的第一个版本开始的,因此它只需要工作一次。我在VS 2013上,也不使用gui设计器,这只是一个包含大量参考和T4模板项目的大型解决方案。
达沃斯2015年

5
我需要过重命名PDB,因为它是锁着也:if exist "$(TargetDir)$(TargetName).pdb.locked" del "$(TargetDir)$(TargetName).pdb.locked" if exist "$(TargetDir)$(TargetName).pdb" if not exist "$(TargetDir)$(TargetName).pdb.locked" move "$(TargetDir)$(TargetName).pdb" "$(TargetDir)$(TargetName).pdb.locked"
托比亚斯Ĵ

也适用于我(Visual Studio 2013)。Thx
Anonymous

继续致力于VS2017。令人惊讶的是,问题仍然存在于VS2017中!
Carvo Loco

24

这不是病毒问题。这是Visual Studio 2010错误。看来问题与使用Visual Studio Gui Designer有关。

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

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

如果使用恒定的临时文件名,您将推迟锁定:

该解决方法仅工作一次

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

我还找到了一个包含2个临时文件的解决方案,该解决方案可以正常工作2次。


1
这也发生在我身上,但前提是我运行我的应用程序。我怀疑这是操作系统出于缓存或其他原因密切关注可执行文件的原因。另外,至少在我看来,这仅发生在调用System.Reflection.Assembly.GetExecutingAssembly()的应用程序中。
TheBlastOne

2
好的,似乎只有在上一次运行调用System.Reflection.Assembly.GetExecutingAssembly时,否则它才会发生,或者-这是新闻-如果任何设计时组件的源代码(组件工具栏中活动的任何设计时组件的源代码)上次运行开始时,在设计时对System.Reflection.Assembly.GetExecutingAssembly的调用在编辑器中打开。得到它了?
TheBlastOne

1
我认为这个问题突然出现了...现在我已经浪费了30分钟的时间来尝试建立项目设置..因为我遇到了锁定问题!我甚至不运行应用程序..
GorillaApe


1
pbd文件的附加内容: del "$(TargetPath).locked.*" /q if exist "$(TargetPath)" move "$(TargetPath)" "$(TargetPath).locked.%random%" del "$(TargetDir)$(TargetName).pdb.locked.*" /q if exist "$(TargetDir)$(TargetName).pdb" move "$(TargetDir)$(TargetName).pdb" "$(TargetDir)$(TargetName).pdb.locked.%random%" exit /B 0
Marv

6

我也遇到了问题。

我的情况是这样的:运行Windows 7(但在Windows XP中可能也会发生),并且在使用WPF用户控件进行项目时,我可以一直构建,直到打开用户控件的XAML文件为止-从那里开始,具有一个版本,然后文件被锁定。

另外,我注意到我以管理员身份运行Visual Studio(Devenv.exe),我已经开始在没有管理员特权的情况下运行Visual Studio,问题就消失了!

让我知道它是否也对您有帮助。祝好运。


1
我在所有VS11版本中都遇到了完全相同的问题,但是还没有找到解决方法(不幸的是,没有管理员特权没有帮助)。任何想法表示赞赏!
丹·诺兰

4

我已经在贪婪的病毒扫描软件或app.exe无法正常关闭的情况下看到了这一点。确保该进程仍未运行。


3

您的计算机上的病毒扫描程序如何?您是否可以看到持有文件句柄的任何进程(使用“进程资源管理器”进行查找)?

也许在进程列表中可见“ app.exe”,即您调试的最后一个版本仍在运行?当您开发具有多个线程的应用程序时,如果没有join全部线程,则可能会发生这种情况。


3

我有同样的问题,我发现,VS仅在构建之前在VS中打开Form或UserControl时才锁定exe。该解决方案非常简单,在构建解决方案并起作用之前,我只需要关闭所有Form / UserControl。


3

基于出色的Stormenet答案,我提出了一个在所有情况下都适用的小脚本。

这是放置在预构建事件文本框中的代码

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

预建活动

这是要复制到文件中的脚本$(SolutionDir)\BuildProcess\PreBuildEvents.bat (当然您可以修改此路径):

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

2

还有一个已知问题533411,其中使用自动更新内部版本号可能导致锁定问题。错误报告的解决方法

临时解决方法是在重建后禁用程序集版本更新。在AssemblyInfo.cs文件中,从AssemblyVersion属性中删除通配符,例如:
替换为:
[assembly:AssemblyVersion(“ 1.4。*”)]
[assembly:AssemblyFileVersion(“ 1.4”)]
改为:
[assembly:AssemblyVersion (“ 1.4.0.0”)]
[程序集:AssemblyFileVersion(“ 1.4.0.0”)]


2

我遇到了这个问题,并通过一些自定义代码解决了它。参见此处:Visual Studio 2010生成文件锁定问题

按照说明解决此问题,在接受的答案中编译实用程序,并在构建步骤中引用该实用程序。我仍然在午餐时关闭VS 2010,以清理早晨的工作。

使用自定义代码的原因是,通常推荐的解决方案只能工作一次,然后重命名的文件也被锁定,从而阻止了重命名。在这里,我们只是将数据时间信息附加到文件中,以便重命名的版本不会冲突。


0

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

问题已解决...直到下一次。


0

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


0

关闭Visual Studio,重新打开并重新加载最新的解决方案对我来说可以解决此问题。(Visual Studio 2013旗舰版)


1
是的,我每次都要这样做。那不是解决方案
约翰·德米特里

0

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

碰巧是Windows Defender用devenv.exe锁定了exe / dll。

您可以转到Win Defender并添加

devenv.exe
msbuild.exe

到流程排除列表。


您是怎么发现它是Windows Defender?
迈克

我的解决方案工作了一段时间,但我发现它实际上是我的新VS2017更新版本中的主要错误。developercommunity.visualstudio.com/content/problem/54945/…–
迈克尔·克

0

这是我找到的解决方案

  1. 取消选中项目设置中的Visual Studio托管过程,如下所示

在此处输入图片说明

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

在此处输入图片说明

  1. 现在,您可以重建应用程序并运行。

注意:您可以再次没有问题地重新启用此选项。


0

我设法通过禁用McAfee LiveSafe实时扫描来解决此问题。我的.exe文件会像OP所描述的那样锁定,并且我无法删除该文件,这意味着我无法构建解决方案。禁用McAfee功能后,问题消失了。

然后,我当然继续完全卸载McAfee,这是因为我的PC是新电脑并且已经安装了程序,所以才安装了McAfee。


-8

我创建了一个新的空白解决方案,并将所有旧文件添加到其中。这样就解决了问题。


这不可能是答案。其他人则提供了更清楚的问题原因以及不需要创建新解决方案文件的适当解决方法,而使用版本控制时,这将是无法接受的,因为会丢失历史记录。
Bernhard Hofmann 2010年

是的,这是一个错误的答案。其他人则更糟。重命名输出文件不是解决方案,这是一个笨拙的解决方法。如果您有更好的主意,为什么不发布答案?
没关系,2010年

创建一个新的解决方案只是暂时解决了我的问题。最好的答案似乎是弗拉基米尔·达祖克(Vladimir Datsyuk)给出的答案。
user492238 2011年

1
如果您在一个解决方案中有15个项目,那么您的解决方案是否是最佳选择?
Shittu Joseph Olugbenga'2
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.