【发布时间】:2011-02-23 03:58:08
【问题描述】:
更新: 可以在here at Microsoft Connect 找到重现此错误的示例项目。我还测试并验证了the accepted answer below 中给出的解决方案适用于该示例项目。如果此解决方案不适合您,您可能遇到了不同的问题(属于单独的问题)。
这是以前在 Stack Overflow 和其他地方提出的问题,但到目前为止我发现的任何建议都没有帮助我,所以我只需要尝试提出一个新问题。
场景:我有一个简单的 Windows 窗体应用程序(C#、.NET 4.0、Visual Studio 2010)。它有几个大多数其他表单继承自的基本表单,它使用实体框架(和 POCO 类)进行数据库访问。没有什么花哨的,没有多线程或任何东西。
问题:有一段时间一切都很好。然后,出乎意料的是,当我即将启动应用程序时,Visual Studio 未能构建。我收到警告 “无法删除文件 '...bin\Debug\[ProjectName].exe'。对路径 '...bin\Debug\[ProjectName].exe' 的访问被拒绝。” 和错误 “无法将文件 'obj\x86\Debug\[ProjectName].exe' 复制到 'bin\Debug\[ProjectName].exe'。进程无法访问文件 'bin\Debug \[ProjectName].exe',因为它正被另一个进程使用。”(我在运行 Rebuild 时同时收到警告和错误,但在运行 Build 时只收到错误 - 认为这不相关吗? )
我完全理解警告和错误消息所说的内容:Visual Studio 显然正试图覆盖 exe 文件,同时由于某种原因它同时被锁定。但是,这并不能帮助我找到问题的解决方案......我发现唯一有效的方法是关闭 Visual Studio 并重新启动它。构建和启动然后工作,直到我对某些表单进行更改,然后我再次遇到同样的问题并且不得不重新启动......非常令人沮丧!
正如我上面提到的,这似乎是一个已知问题,因此有很多建议的解决方案。我将在这里列出我已经尝试过的内容,以便人们知道要跳过的内容:
-
创建一个新的干净解决方案,然后从旧解决方案中复制文件。
-
将以下内容添加到项目的预构建事件中:
if exist "$(TargetPath).locked" del "$(TargetPath).locked" if not exist "$(TargetPath).locked" if exist "$(TargetPath)" move "$(TargetPath)" "$(TargetPath).locked" -
将以下内容添加到项目属性(.csproj 文件)中:
<GenerateResourceNeverLockTypeAssemblies>true</GenerateResourceNeverLockTypeAssemblies>
但是,它们都不适合我,因此您可能会明白为什么我开始有点沮丧。我不知道还能去哪里看,所以我希望有人能给我一些东西!这是VS中的一个错误,如果是,有补丁吗?还是我做错了什么,我有循环引用或类似的,如果有,我怎么能找到?
任何建议都非常感谢:)
更新:正如下面评论中提到的,我还使用 Process Explorer 检查了它实际上是 锁定文件的 Visual Studio。
【问题讨论】:
-
您是否检查过您的应用程序是否正常关闭?任务管理器会在进程列表中显示 [ProjectName].exe 吗?
-
我以前有过这个,我只是将文件重命名为 .old 等并重新运行构建。不完全是我知道的修复方法,但它对我有用。
-
@miensol:是的,它似乎正确关闭。我得到“程序 '[1848] [ProjectName].vshost.exe: Managed (v4.0.30319)' 已退出,代码为 0 (0x0)。” @Barry:重命名 bin\Debug 中的 exe 文件是可行的,但正如你所说,这并不是一个真正的解决方案,每次都必须这样做会很烦人。虽然比重新启动 Visual Studio 好一点...
-
@Naliluj:我在微软论坛上看到this 的文章,它解释了它可能与资源文件有关。如果您使用的是 resx 文件,这可能会给出提示。
-
为了后代,我遇到了这个问题,通过将
true 元素添加到我的 csproj 文件中解决了这个问题。
标签: c# .net winforms visual-studio