在Visual Studio 2010中生成时锁定文件

str*_*103 16 c# xna visual-studio-2010

你好,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上的一些不同的问题中,我发现了一个解决方案是你进入Project Properties > Build Events,然后在预构建事件命令行中添加:

if exist "$(TargetPath).locked" del "$(TargetPath).locked"
if not exist "$(TargetPath).locked" move "$(TargetPath)" "$(TargetPath).locked"
Run Code Online (Sandbox Code Playgroud)

这使我有可能比平时更多地构建项目,但是当再次编辑代码然后构建时,出现了同样的错误.

注意:尝试构建版本而不是调试版本似乎打破了预构建脚本,并且它以代码"1"退出,这似乎使VS无法正确构建.删除预构建脚本使其再次像"正常"一样工作,但仍然有相同的错误.

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

这是我发现的另一个解决方案,但是对我来说也没有用,所以我认为Visual Studio已经拥有所需的所有权限并且以管理员身份运行实际上没有任何区别.

解决方案3 - 更改AssemblyVersion

在这个问题中,Visual Studio构建失败:无法将exe文件从obj\debug复制到bin\debug,我找到了另一个解决方案,包括AssemblyVersionProperties\AssemblyInfo.cs文件中更改"2.0.0.0".然而,这对我没有任何影响.

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

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

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

这可能是我未能正确实施的解决方案.我只是想,如果这是解决方案,我怎么没有被要求这样做.我假设XNA卸载了通过Content管道加载的所有内容,因此这个解决方案不会"真正有意义".

如果有人能够在这个问题上传播一些亮点,那真的很棒,因为它阻止我编程任何东西,因为我不喜欢等待10分钟因为我做了2秒钟的改变每时每刻.

mcm*_*eva 2

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

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

基本上,我的程序从未完全退出,即使它看起来是这样。它将继续运行,从而继续锁定文件。

我最初使用的快速肮脏修复(以及证明情况是否如此的方法)是:

  • 打开任务管理器(Ctrl-Alt-Del)
  • 单击“进程”选项卡
  • 查找您的程序名称(TileEngine.exe)
  • 注意:可能会有 name_vshost.exe (TileEngine_vshost.exe) 这是 VisualStudio 的东西,忽略它,它不相关。
  • 如果找到它,则意味着您的程序实际上尚未完全退出。
  • 如果存在,请单击它并按“结束进程”

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

通常,这是由于启动并忘记了线程,或者从未完成的异步任务,或类似的情况。

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

如果您的程序仍在运行,尽管尽了最大努力关闭所有线程和其他阻止程序,您可以使用非常肮脏的坏方法:在 OnExiting(...) 中运行代码“System.Diagnostics.Process.GetCurrentProcess().Kill() ;” - 这将以任务管理器式的方式强制关闭当前进程...这只是一种紧急情况,我无法以任何其他方式使其工作。