ChatGPT解决这个技术问题 Extra ChatGPT

构建错误:“该进程无法访问该文件,因为它正被另一个进程使用”

我有一个 C# webforms 应用程序,直到今天它一直在正常工作。

现在,突然之间,每次尝试运行该应用程序时,都会出现文件锁定错误:

无法将文件“obj\Debug\MyProject.exe”复制到“bin\Debug\MyProject.exe”。该进程无法访问文件“bin\Debug\MyProject.exe”,因为它正被另一个进程使用。

谷歌搜索错误并没有提出任何明显的问题,即 VS 认为文件已被锁定。锁定文件的绝对是 Visual Studio 本身,因为当我关闭 VS 并重新打开它时,项目执行得很好——第一次。当我再次尝试运行它时,我收到文件锁定错误。

每次我想运行应用程序时关闭 VS 并重新打开都不是可行的解决方法!如何找出锁定文件的原因,并阻止它被锁定?

编辑:另一个有趣的发现:我什至不必运行该应用程序。只编译一次就会导致文件锁定;我不能连续编译两次!

此问题特定于我的解决方案中的一个项目。所有其他项目都可以正常工作,并且可以根据需要执行多次。只有这个项目自己被锁定了。

您可以尝试杀死 vshost.exe 看看是否有帮助?
@rene - 没有 vshost.exe 进程。他们在VS 2010中重命名了吗?
[您的应用程序名称].vshost.exe
@rene - 不,当前进程中没有显示该名称
@Shaul 您是否在表单中添加了自定义用户控件?尝试在运行前关闭设计器:stackoverflow.com/questions/2690119/…

d
dakab

我找到了一个适合我的简单解决方案。它是这样的:

出现问题时,只需将顶部的构建配置更改(如果在“Release”中为“Debug”,反之亦然),构建然后更改回之前的配置并再次构建。

https://i.stack.imgur.com/k3f2l.png

我想更改配置会释放 vcshost 和 devenv。


最佳答案,海事组织。 (啊——他给了自己信任。)
这是一个很好的解决方法!虽然有时它会因为某种原因停止工作(?)。
@ChrisEmerson我也注意到了。我可以切换到发布并构建和运行应用程序,但切换回调试后甚至无法构建项目。
我最终不得不重新启动 Visual Studio 以摆脱程序集。我尝试重置 IIS,以及上面的解决方案,但我仍然可以看到位于文件夹 C:\Windows\Microsoft.NET\assembly\GAC_MSIL 中的 dll 文件
这只工作了一次,然后再也没有。即使在重新启动 VS 之后也不会。无论我在 Release 和 Debug 之间切换多少,它都会失败。
S
Shaul Behr

好吧,我自己解决了这个问题——尽管我仍然不知道为什么。我决定通过从项目中删除所有文件来隔离问题,然后重新添加它们并确定哪个文件是我的问题的根源。因此,我一个接一个地将文件重新引入项目,编译并清理了每一步……直到……我添加了最后一个……

...一切仍然正常。

我与原始 .csproj 的源代码控制进行了比较;没有真正的区别。即使当我尝试恢复到以前版本的 .csproj 时,它仍然有效。

黑魔法。如果它有效,有时最好不要问为什么 - 接受它并继续前进......

编辑:这个问题是一个反复出现的问题,我相信我已经将它隔离到当我在编译时让表单设计器打开抽象/通用表单时。

经验教训:确保在编译之前关闭任何抽象或通用表单或控件的表单设计器!如果没有,您必须关闭VS并重新打开!


也许是因为自从它被删除以来,任何有问题的文件都不再被任何进程访问。删除所有文件确实应该解决这个问题。好想法。
这仍然发生在仅命令行项目(无表单)中,所以我不确定您是否真的在做任何事情。
Y
Yechiel B.D.

我们在这里发现如下:在项目属性页面的“调试”选项卡中,取消选中“启用 Visual Studio 托管进程”。我不确定这个属性是做什么用的,但是一旦不检查它就会起作用。


它确实解决了这个问题,但 Console.WriteLine() 不再在输出窗口中输出字符串。
取消选中控制台应用程序上的框后问题仍然存在。
它适用于 Windows 客户端项目。我取消选中该框,构建成功,然后重新选中它并再次成功构建。
不为我工作。现在应用程序本身已锁定。不是主机应用程序。
与我一起为一个包含第二个 WCF 服务项目的接口的项目工作。无法复制/替换带有接口的项目 DLL。我取消选中了 WCF 项目中的设置,这释放了对带有界面的项目的保留。现在我可以毫无问题地构建。另请注意,该项目设置为将 DLL 从 obj 文件夹复制到第三个位置,即
l
lloyd

VS2017 - 通过在windows任务管理器中关闭MSBuild.exe的所有实例解决


J
Justin W

实际上,您应该检查“启用 Visual Studio 托管进程”。无论如何至少对于VS2010。而且我还有:

如果存在 "$(TargetPath).locked" del "$(TargetPath).locked" 如果存在 "$(TargetPath)" 如果不存在 "$(TargetPath).locked" move "$(TargetPath)" "$(TargetPath) .锁定”

在预构建选项中。这个问题困扰了我很长时间,直到 John W. 提到这个复选框,我才注意到它的存在并且很低,并且看到它已经未被选中。

还要注意 -app-vshost.exe 即使在不调试时也会在后台运行。这就是我每次猜测它都能成功构建和运行的原因。它之前没有运行。而且我还尝试清理调试和发布文件夹并不断更改目标类型,除了如上所述之外没有任何效果。我之前的解决方案是在构建之间等待 5 分钟,这让任何事情都变得非常烦人和耗时。我没有看到行为的任何变化,其中打开的选项卡或 XNA 与 Windows 窗体或打开的设计器很重要。此问题发生在 32 位或 64 位版本中,无论我是使用 ALT-F4 还是使用任务管理器杀死应用程序都无关紧要,这在理论上不允许应用程序关闭或释放资源。一开始我以为是垃圾回收问题。


这里的预构建事件脚本终于为我解决了这个问题 - 谢谢!
这是唯一对我有用的评论,我不敢相信这么简单的问题在没有补丁的情况下持续存在多年。
O
Ola Eldøy

我通过重命名锁定的文件(使用 Windows 资源管理器)克服了这个问题。我不允许删除文件,但重命名锁定的文件有效!


这是迄今为止唯一对我有用的解决方案。很好的解决方案。省去了我重启的麻烦。
将其作为预构建会很好。我总是有这个问题!很烦人。
T
Thameem

回答有点晚了,但我通过转到项目的属性 > 选项卡“调试”> 未选中“启用 Visual Studio 托管进程”选项解决了这个问题。


J
Johannes Wentu

我通过删除文件夹 bin\Debug 并可能重新启动 VS 解决了这个问题


问题是你不能每次都这样做。对我来说,每次我重建然后尝试运行应用程序时都会发生错误。
t
toha

从“运行”框中运行此命令:

net stop iisadmin /y

接着

iisreset

为我工作。与 2003 年相比


G
Garrison Neely

对我来说,它是一个已安装并正在运行的 Windows 服务。一旦我停止它,构建就成功了。


A
Alex Misiulia

我在部署 UWP 应用程序期间遇到了类似的错误。最后,我发现了使用导致此错误的文件的进程并将其停止。归功于 this 链接。复制粘贴的版本如下。

如何解决问题?

处理锁定文件或文件夹的最简单方法之一是使用 Microsoft Sysinternals Process Explorer

识别正在使用文件的程序

使用 Process Explorer 有一种查找程序的简单方法:

打开 Process Explorer(以管理员身份运行)。在工具栏上,找到右侧的瞄准镜图标。将图标拖放到打开的文件或锁定的文件夹上。正在使用该文件的可执行文件将在 Process Explorer 主显示列表中突出显示。

确定哪个句柄或 DLL 正在使用文件

打开 Process Explorer(以管理员身份运行)。输入键盘快捷键 Ctrl+F。或者,单击“查找”菜单并选择“查找句柄或 DLL”。将打开一个搜索对话框。输入锁定文件或其他感兴趣的文件的名称。部分名称通常就足够了。单击“搜索”按钮。将生成一个列表。可能有多个条目。

然后杀死这个进程。


G
Guy Passy

最近在尝试构建我正在处理的解决方案(不仅仅是一个 winforms 项目)时遇到了这个问题。
除了 build 失败,我注意到清理项目会悄悄失败(检查 bin 文件夹显示文件实际上并没有被删除)并且关闭 Visual Studio 并没有结束 devenv 进程 - 而是导致它崩溃。然后 Windows 恢复过程将重新启动 Visual Studio。

经过一些试验和错误后,我发现只有在启动 VS 时从“最近”菜单打开解决方案时才会出现问题。
File >> Open >> Project/Solution 打开解决方案发现它正常工作。

目前不知道为什么 - 会继续研究这个,但现在,至少我可以工作!


D
David Silva-Barrera

只需检查引用并删除对项目的自我引用。

说明:我的问题是在创建自定义控件并将其拖放到工具箱调色板以在设计表单中使用之后开始的。首先出现一条警告,指出自定义控件源文件 (.cs) 和项目可执行文件 (.exe) 之间存在冗余。在执行/调试时出现错误:无法访问(.exe),因为它正在被使用(这是真的)。

我从字面上删除了有关自定义控件的整个源代码,但问题仍然存在,直到我检查了引用并且它正在引用自身以便“能够”获得以前的自定义控件。我删除了引用并完成了!


T
Tomislav3008

我在 Visual Studio 中的 Xamarin 应用程序上遇到了同样的问题,通过拔下我的测试移动设备解决了这个问题。应用程序已关闭,调试器已停止,但在尝试构建或重建解决方案时仍然发生错误。它只是在我拔掉设备后才停止,因为我必须接听电话。


B
Benjamin McGill

只是为了投入我的 2 美分。通过打开任务管理器并终止应用程序解决了我的问题。它在后台运行,根本没有任何迹象表明它正在运行(任务栏中没有项目,没有 ui,什么都没有),但我不确定为什么会发生这种情况。显然调试器没有运行,当时我只打开了一个 VS 实例。令我惊讶的是,这仍然在这个 VS 2017 中发生。

也许我可以添加一个构建步骤来查找运行后台的应用程序并在启动新应用程序之前将其杀死。


B
B.M.

我有同样的问题,无法通过使用前面答案中提到的任何方法来纠正。我通过在任务管理器中杀死所有“SSIS Debug Hist(32 位)”实例解决了这个问题,现在可以正常工作了。


K
KevinLeeSmith

我遇到了这个问题(这是我在其他地方看到的问题,而不仅仅是 VS)。

这是由 Dropbox(在我的情况下)引起的。在编辑一些代码并点击运行后,有时 Dropbox 会立即锁定文件(以便它可以处理它)。

解决方案 1. 再次点击运行

解决方案 2. 暂停保管箱。 (如果您使用保管箱作为云备份,那就不好了)

解决方案 3. 从保管箱同步列表中删除构建文件夹。


是的,Dropbox 绝对是导致此错误的一个可能原因。感谢您发布此信息。
S
Siddhant Gupta

删除 .NET 项目的 Obj、retail 和 debug 文件夹并再次重新构建对我有用。


A
Alaa M.

不幸的是,没有一个答案对我有用。这就是解决它的方法:

Win Key + R 并运行 resmon.exe。在那里你会发现 VS 声称正在使用该文件的 EXE 进程。右键单击并结束进程。尽管您可能会收到 Access Denied 错误消息,但它会被暂停,您将能够再次构建。


太棒了,辛苦了。任何尝试此操作的人的额外说明 - 当我打开资源监视器时,它默认为磁盘选项卡,看不到它在那里抱怨的 exe,必须切换到内存选项卡
C
Chidi-Nwaneto

这让我困了两天多,不得不重新克隆项目并以不同的名称保存项目文件夹,但今天我从微软开发论坛找到了解决方案。

解决方案:

通过转到项目属性(在解决方案资源管理器中右键单击项目,然后选择“属性”选项),在项目中创建预构建操作,选择“构建事件”选项卡。添加此代码:

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

此代码会将文件复制到不同的名称,并允许构建继续成功。


A
Andy

您的网络应用程序是如何配置的?它是在 Cassini(托盘 Web 服务器)还是 IIS 下运行?

这不应该正常发生。我认为 ProcessExplorer 可以告诉您进程锁定了哪些文件。如果不是其他 sysinternals 工具之一,请处理资源管理器。

在下载其中一个 SI 工具之前要尝试的一件事是停止 Cassini Web 服务器,并查看是否可以释放文件。


它不是网络应用程序;这是winforms。
啊,那么您可能想在开始时编辑您的问题“我有一个 C# webforms 应用程序......”
B
Beanwah

对我有用的是重新启动 IIS


O
Obelix

我也有同样的问题。更改调试/发布配置并没有解决问题。至少不是没有在两者之间建立。

在我的解决方案(winform)中,它是通过在设计器中打开winform的主窗体来解决的。切换到代码 (F7)。然后关闭代码,关闭winform的设计器,全部重建(ctrl-shift-B)。这对我有用。

似乎winform应用程序(运行后台工作程序)中的某种句柄仍然在使用的其他一些库上具有文件句柄。


J
Janis S.

我有两个 Visual Studio 实例打开了相同的解决方案。


J
J T

在我的情况下,有一些 vstest 进程正在运行(具有各种名称,但都包含字符串 vstest)。我不得不在 taskmgr 中终止它们。


G
Gustavo Baiocchi Costa

同样的错误,通过更新 Google Nuget 支持包解决


s
slimeygecko

当我结束进程 .Net Core Host 时,一切正常。我不必关闭 Visual Studio 或更改任何其他内容。


C
Carlos

用 Docker 做 VS 开发的朋友,重启 docker for windows 服务,问题立马解决。

在重新启动 docker 之前,我尝试了所有提到的答案,没有找到正在运行的 msbuild.exe 进程,还尝试重新启动 VS 无济于事,只有重新启动 docker 才有效。


T
TripleAccretion

另一种解决方案:当文件被锁定时,会报告阻塞进程(类似于“ServiceHub.Host.CLR.x64 (7764)”),其 id 在括号中。要摆脱该进程,请打开 PowerShell (x + Win + I) 并键入:“Stop-Process -Id idNumber”。


o
osoclever

我最近在部署到 Service Fabric 时遇到了这个问题。该错误暗示正在使用“文件”,但是,我发现该端口正在被另一个 IDE 使用。通过停止已经在端口上托管的正在运行的服务,我能够阻止此异常的发生。