更新: 可 在Microsoft Connect上找到重现此错误的示例项目。我还测试并验证了下面接受的答案中给出的解决方案可用于该示例项目。如果此解决方案不适合您,则可能是您遇到了其他问题(属于一个单独的问题)。
这是之前在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中被锁定的文件。
这听起来很愚蠢,但是我尝试了所有这些解决方案,并在Windows 7上运行VS2010。除了重命名和构建(至少可以说这很繁琐)之外,它们都没有起作用。最终,我找到了罪魁祸首,我很难相信。但是我在AssemblyInfo.cs中使用以下代码…
[assembly: AssemblyVersion("2.0.*")]
这很普遍,但是由于某种原因,将版本更改为2.0.0.0会使事情再次起作用。我不知道这是否是Windows 7专用的东西(我只使用了3-4周),或者它是随机的,还是什么,但是它为我修复了它。我猜想VS会对它生成的每个文件保持句柄,因此它会知道如何增加内容?我真的不确定,也从未见过这种情况。但是,如果外面有人也将其头发拉出,请尝试一下。