更新:可以在Microsoft Connect中找到重现此错误的示例项目。我还测试并验证了下面接受的答案中给出的解决方案适用于该示例项目。如果此解决方案对您不起作用,则您可能遇到了不同的问题(属于单独的问题)。
这是以前在Stack Overflow和其他地方问过的问题,但到目前为止我找到的建议都没有帮助我,所以我必须尝试问一个新问题。
场景:我有一个简单的Windows窗体应用程序(C#、.NET 4.0、Visual Studio 2010)。它有几个基本表单,大多数其他表单都继承自这些表单,它使用实体框架(和POCO类)进行数据库访问。没有花哨的东西,没有多线程或任何东西。
问题:有一段时间一切都很好。然后,出乎意料的是,当我准备启动应用程序时,VisualStudio无法构建。我得到了警告";无法删除文件..。bin\debug\[项目名称].exe.访问路径“..”。bin\debug\[projectname].exe被拒绝。";和错误";无法将文件“ obj\x86\debug\[projectname].exe ”复制到“ bin\debug\[projectname].exe ”。该进程无法访问文件“ bin\debug\[projectname].exe ”,因为另一进程正在使用该文件。(我在运行重建时得到了警告和错误,但在运行构建时只得到了错误-不认为这是相关的?)
我完全理解警告和错误消息所说的:很明显,VisualStudio正在尝试覆盖EXE文件,同时由于某种原因,它对该文件进行了锁定。然而,这并不能帮助我找到解决问题的办法……我发现唯一有效的方法是关闭VisualStudio并重新启动它。构建和启动然后工作,直到我在一些表单中进行了更改,然后我又遇到了同样的问题,不得不重新启动..相当令人沮丧!
正如我上面提到的,这似乎是一个已知的问题,所以有很多建议的解决方案。我将在这里列出我已经尝试过的内容,以便人们知道要跳过哪些内容:
创建一个新的干净的解决方案,并从旧的解决方案中复制文件。
以下内容添加到项目的预生成事件中:
if exist "$(TargetPath).locked" del "$(TargetPath).locked"
if not exist "$(TargetPath).locked" if exist "$(TargetPath)" move "$(TargetPath)" "$(TargetPath).locked"
以下内容添加到项目属性(.csproj文件):
<GenerateResourceNeverLockTypeAssemblies>true</GenerateResourceNeverLockTypeAssemblies>
然而,他们都没有为我工作,所以你可能会看到为什么我开始变得有点沮丧。我不知道还能去哪里找,所以我希望有人能给我点什么。这是VS中的错误吗?如果是,是否有补丁?或者我做错了什么,我是否有循环引用或类似的引用,如果有,我如何才能发现?
任何建议都非常感谢:)
__下面的注释中提到的ABC0,我还使用Process Explorer检查了它实际上__锁定文件的Visual Studio ABC1。