在使用Visual Studio 2010进行构建时如何锁定文件

16

你好,Stackoverflow。

最近使用Visual Studio 2010编程时,我在构建时遇到了一个问题,VS会锁定bin/Debug/(ProjectName).exe文件并在尝试构建项目10次后给出以下错误:

无法将文件 "obj\x86\Debug\TileEngine.exe" 复制到 "bin\x86\Debug\TileEngine.exe"。由于另一个进程正在使用该文件,因此无法访问文件“bin\x86\Debug\TileEngine.exe”。

当我编辑源代码然后尝试调试时,就会出现这个问题。我使用不同的程序进行了检查,唯一使用该文件的程序是Visual Studio。

如果我等待约10分钟再尝试构建,似乎会正常工作,但在尝试不同的事情时,需要等待10分钟才能尝试。

我已经尝试了在本站以及Google上找到的各种解决方案。

我找到的一些解决方案,但对我没有用

解决方案1-使用预构建脚本

在Stackoverflow的一些不同问题中,我发现一个解决方案是进入项目属性>生成事件,然后在预构建事件命令行中添加:

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

这使得我能够比通常多建立一个项目,但当我再次编辑代码并构建时,出现了相同的错误。

注意:尝试构建发布版本而不是调试版本似乎会破坏预构建脚本并退出代码'1',这似乎使VS无法正确构建。删除预构建脚本会使其恢复正常,尽管仍然出现相同的错误。

解决方法2-以管理员身份运行Visual Studio

这是我发现的另一种解决方案,但对我也没有起作用,因此我认为Visual Studio已经具有所需的所有权限,并且以管理员身份运行实际上没有任何区别。

解决方法3-更改AssemblyVersion

在这个问题中,Visual Studio构建失败:无法从obj\debug复制exe文件到bin\debug,我找到了另一个解决方案,其中包括在Properties\AssemblyInfo.cs文件中更改AssemblyVersion"2.0.0.0"。 然而,对我来说完全没有任何区别。

解决方法4-在构建之前关闭UserControl设计器

根据互联网上的一些不同答案,Visual Studio显然使用构建项目可执行文件来呈现UserControl设计器(? )。 在我的情况下,这可能不是它,因为我主要使用XNA,而它不使用UserControl设计器。

解决方法5-清理应用程序退出时的资源

这可能是一个我未能正确实现的解决方案。 我只是想,如果这是解决方案,那么为什么我以前没有被要求这样做。 我认为XNA会卸载通过Content管道加载的所有内容,因此这个解决方案并没有真正意义。

如果有人能够解决这个问题,那将是非常棒的,因为它阻止了我编写任何东西,因为我不喜欢因为每次进行2秒更改而等待10分钟。


欢迎来到Stackoverflow。感谢您的努力,即使这是您的第一个问题,也请接受我的加分。 - Soner Gönül
1
谢谢!我在这里看到了很多其他糟糕的问题,所以我不想自己提出一个糟糕的问题 =) - stripe103
这看起来是一个非常相似的问题,有一个明确的解决方案:https://dev59.com/Sm865IYBdhLWcg3wQMSW - parvus
这个问题大约一年前就已经解决了,不过还是谢谢 =P - stripe103
11个回答

2

我自己也遇到过这个问题。

我的问题可能不是和你的原因一样,但是我会告诉你我的问题是什么以及我是如何解决它的,希望对你有所帮助。

基本上,即使程序看起来已经完全退出了,但它实际上没有完全退出,它还在运行,从而继续锁定文件。

我最初使用了一个快速且不太好的方法来解决这个问题(并且这也是一种证明问题是否存在的方法):

  • 打开任务管理器(Ctrl-Alt-Del)
  • 点击“进程”标签页
  • 查找你的程序名称(TileEngine.exe)
  • 注意:可能会有一个名为name_vshost.exe(TileEngine_vshost.exe)的VisualStudio程序,请忽略它,它与此无关。
  • 如果你找到了它,那么说明你的程序没有完全退出。
  • 如果它在那里,请单击它并按“结束进程”。

因此,如果它在那里,那么出于某种原因,你的程序没有关闭,就像我的程序一样。

通常情况下,这是由于启动未完成的线程或未完成的异步任务等原因导致的。

确保在你的OnExiting(..)空函数中杀死所有正在运行的线程。

如果你尽最大努力关闭所有线程和其他障碍,但程序仍然在运行,你可以使用非常不好的暴力方法: 在OnExiting(...)中运行代码“System.Diagnostics.Process.GetCurrentProcess().Kill();”- 这将类似于任务管理器强制关闭当前进程...这只是一种紧急情况下无法使用其他方法成功的方法。


是的,那也是我的第一反应。但是当查看任务管理器,甚至更高级的程序如Sysinternals Process Explorer时,该进程并不存在。 - stripe103

2
我想我已经找到了解决方案。 在项目属性中,“启用Visual Studio托管进程”未被选中。勾选它似乎已经解决了问题,至少目前是这样的。
从mcmonkey4eva的帖子中得到了提醒。所以感谢他=)
还要感谢其他回复。Stackoverflow太棒了!

1
嗯...技术上来说那不是答案,但是提醒我去检查一些东西,结果那就是答案了。但没问题 =) - stripe103
这就是解决我的问题的方法。最近一次VS的更新使得我的项目中出现了这个选项,而之前并没有。我差点就要砸屏幕了! - Brett Ryan

1

你是否检查过防火墙是否阻止了任何文件?当我切换到完整版的Avast时,我发现我必须禁用文件系统防护。它喜欢在我运行Visual Studio项目时删除我的可执行文件。

我在升级到VS2012专业版时遇到了问题。(SDK,.Net,Visual C++ Redistributable package)

确保所有这些都与您正在使用的当前版本的VS兼容

我所做的是,最终卸载了与两个Visual Studio下载相关联的所有内容。 如果您能够将项目文件移除并保存到其他地方,然后再重新导入。检查所有程序文件,看看是否有任何隐藏在错误文件夹中的东西,并检查C驱动器。

这意味着需要下载和重新安装(全新):

我认为如果您清理掉程序文件,应该就没问题了。我不建议进入注册表,除非您非常确定自己在做什么。如果您已经对注册表进行了更改,那么我们将查看其他选项(如果此方法无法解决问题)。


是的,我不打算尝试编辑注册表。尽管CCleaner在“修复”注册表错误时可能出了问题。也许?关闭文件系统盾牌也没有起作用。仍然是同样的错误。等我有时间的时候,我会尝试重新安装Visual Studio。 - stripe103
嗯,我有点怀疑CCleaner是罪魁祸首。它试图删除一些由例如Visual Studio使用的文件类型,如.suo、.cpp、.h和.cs文件类型。我尝试使用VS安装程序中的“更改/重新安装”选项,并让它执行它实际上要执行的任何操作,但什么也没变,问题仍然存在。我希望我不需要再次重新安装Windows。 - stripe103
我做过,但是很久以前了。我不确定自那时起我做了哪些其他更改。 - stripe103
我没有这样做,我只是使用了VS Iso中的安装程序。但是我似乎已经找到了解决问题的方法。至少是一个临时的解决方案。 - stripe103

1
我遇到了这个问题,在我的情况下是由于将bin文件夹包含在解决方案中。当我将bin文件夹从解决方案中排除后,问题就消失了。

1

没有任何帮助,不管是预构建命令还是关闭设计师,但我找到了一个方法可以帮助我,只需要从debug模式切换到release模式,或者从release模式切换到debug模式,这样就能释放被锁定的文件,而无需关闭IDE即可删除它们。


1
尝试通过在文件夹级别取消勾选来移除您的解决方案中的只读检查。

0

我通过整理我的解决方案来解决了这个问题。当我将一些图像放在同一个解决方案文件夹中的应用程序中时,我注意到了这个错误。

所以,

  • 我从应用程序中删除了所有图像和资源,并保存。
  • 将图像移动到解决方案文件夹之外。
  • 打开解决方案并再次添加这些图像,使用控件中的“导入”按钮。

如果您要尝试此操作,请记得在项目设置中处理应用程序图标。

现在,对我来说一切都正常了。

希望能对您有所帮助。


0

将构建平台目标从x86更改为“任何CPU”。


0

如果我从Debug模式切换到Release模式,然后立即按F5编译,我经常会遇到这个问题。听起来很疯狂,但是在模式之间切换后等待一分钟左右可以防止这种情况发生。

如果被锁定了,唯一的解决方法就是关闭Visual Studio并重新打开。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接