我有一个 C# webforms
应用程序,直到今天它一直在正常工作。
现在,突然之间,每次尝试运行该应用程序时,都会出现文件锁定错误:
无法将文件“obj\Debug\MyProject.exe”复制到“bin\Debug\MyProject.exe”。该进程无法访问文件“bin\Debug\MyProject.exe”,因为它正被另一个进程使用。
谷歌搜索错误并没有提出任何明显的问题,即 VS 认为文件已被锁定。锁定文件的绝对是 Visual Studio 本身,因为当我关闭 VS 并重新打开它时,项目执行得很好——第一次。当我再次尝试运行它时,我收到文件锁定错误。
每次我想运行应用程序时关闭 VS 并重新打开都不是可行的解决方法!如何找出锁定文件的原因,并阻止它被锁定?
编辑:另一个有趣的发现:我什至不必运行该应用程序。只编译一次就会导致文件锁定;我不能连续编译两次!
此问题特定于我的解决方案中的一个项目。所有其他项目都可以正常工作,并且可以根据需要执行多次。只有这个项目自己被锁定了。
我找到了一个适合我的简单解决方案。它是这样的:
出现问题时,只需将顶部的构建配置更改(如果在“Release”中为“Debug”,反之亦然),构建然后更改回之前的配置并再次构建。
https://i.stack.imgur.com/k3f2l.png
我想更改配置会释放 vcshost 和 devenv。
好吧,我自己解决了这个问题——尽管我仍然不知道为什么。我决定通过从项目中删除所有文件来隔离问题,然后重新添加它们并确定哪个文件是我的问题的根源。因此,我一个接一个地将文件重新引入项目,编译并清理了每一步……直到……我添加了最后一个……
...一切仍然正常。
我与原始 .csproj 的源代码控制进行了比较;没有真正的区别。即使当我尝试恢复到以前版本的 .csproj 时,它仍然有效。
黑魔法。如果它有效,有时最好不要问为什么 - 接受它并继续前进......
编辑:这个问题是一个反复出现的问题,我相信我已经将它隔离到当我在编译时让表单设计器打开抽象/通用表单时。
经验教训:确保在编译之前关闭任何抽象或通用表单或控件的表单设计器!如果没有,您必须关闭VS并重新打开!
我们在这里发现如下:在项目属性页面的“调试”选项卡中,取消选中“启用 Visual Studio 托管进程”。我不确定这个属性是做什么用的,但是一旦不检查它就会起作用。
VS2017 - 通过在windows任务管理器中关闭MSBuild.exe的所有实例解决
实际上,您应该检查“启用 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 还是使用任务管理器杀死应用程序都无关紧要,这在理论上不允许应用程序关闭或释放资源。一开始我以为是垃圾回收问题。
我通过重命名锁定的文件(使用 Windows 资源管理器)克服了这个问题。我不允许删除文件,但重命名锁定的文件有效!
回答有点晚了,但我通过转到项目的属性 > 选项卡“调试”> 未选中“启用 Visual Studio 托管进程”选项解决了这个问题。
我通过删除文件夹 bin\Debug 并可能重新启动 VS 解决了这个问题
从“运行”框中运行此命令:
net stop iisadmin /y
接着
iisreset
为我工作。与 2003 年相比
对我来说,它是一个已安装并正在运行的 Windows 服务。一旦我停止它,构建就成功了。
我在部署 UWP 应用程序期间遇到了类似的错误。最后,我发现了使用导致此错误的文件的进程并将其停止。归功于 this 链接。复制粘贴的版本如下。
如何解决问题?
处理锁定文件或文件夹的最简单方法之一是使用 Microsoft Sysinternals Process Explorer。
识别正在使用文件的程序
使用 Process Explorer 有一种查找程序的简单方法:
打开 Process Explorer(以管理员身份运行)。在工具栏上,找到右侧的瞄准镜图标。将图标拖放到打开的文件或锁定的文件夹上。正在使用该文件的可执行文件将在 Process Explorer 主显示列表中突出显示。
确定哪个句柄或 DLL 正在使用文件
打开 Process Explorer(以管理员身份运行)。输入键盘快捷键 Ctrl+F。或者,单击“查找”菜单并选择“查找句柄或 DLL”。将打开一个搜索对话框。输入锁定文件或其他感兴趣的文件的名称。部分名称通常就足够了。单击“搜索”按钮。将生成一个列表。可能有多个条目。
然后杀死这个进程。
最近在尝试构建我正在处理的解决方案(不仅仅是一个 winforms 项目)时遇到了这个问题。
除了 build
失败,我注意到清理项目会悄悄失败(检查 bin 文件夹显示文件实际上并没有被删除)并且关闭 Visual Studio 并没有结束 devenv
进程 - 而是导致它崩溃。然后 Windows 恢复过程将重新启动 Visual Studio。
经过一些试验和错误后,我发现只有在启动 VS 时从“最近”菜单打开解决方案时才会出现问题。
从 File >> Open >> Project/Solution
打开解决方案发现它正常工作。
目前不知道为什么 - 会继续研究这个,但现在,至少我可以工作!
只需检查引用并删除对项目的自我引用。
说明:我的问题是在创建自定义控件并将其拖放到工具箱调色板以在设计表单中使用之后开始的。首先出现一条警告,指出自定义控件源文件 (.cs) 和项目可执行文件 (.exe) 之间存在冗余。在执行/调试时出现错误:无法访问(.exe),因为它正在被使用(这是真的)。
我从字面上删除了有关自定义控件的整个源代码,但问题仍然存在,直到我检查了引用并且它正在引用自身以便“能够”获得以前的自定义控件。我删除了引用并完成了!
我在 Visual Studio 中的 Xamarin 应用程序上遇到了同样的问题,通过拔下我的测试移动设备解决了这个问题。应用程序已关闭,调试器已停止,但在尝试构建或重建解决方案时仍然发生错误。它只是在我拔掉设备后才停止,因为我必须接听电话。
只是为了投入我的 2 美分。通过打开任务管理器并终止应用程序解决了我的问题。它在后台运行,根本没有任何迹象表明它正在运行(任务栏中没有项目,没有 ui,什么都没有),但我不确定为什么会发生这种情况。显然调试器没有运行,当时我只打开了一个 VS 实例。令我惊讶的是,这仍然在这个 VS 2017 中发生。
也许我可以添加一个构建步骤来查找运行后台的应用程序并在启动新应用程序之前将其杀死。
我有同样的问题,无法通过使用前面答案中提到的任何方法来纠正。我通过在任务管理器中杀死所有“SSIS Debug Hist(32 位)”实例解决了这个问题,现在可以正常工作了。
我遇到了这个问题(这是我在其他地方看到的问题,而不仅仅是 VS)。
这是由 Dropbox(在我的情况下)引起的。在编辑一些代码并点击运行后,有时 Dropbox 会立即锁定文件(以便它可以处理它)。
解决方案 1. 再次点击运行
解决方案 2. 暂停保管箱。 (如果您使用保管箱作为云备份,那就不好了)
解决方案 3. 从保管箱同步列表中删除构建文件夹。
删除 .NET 项目的 Obj、retail 和 debug 文件夹并再次重新构建对我有用。
不幸的是,没有一个答案对我有用。这就是解决它的方法:
Win Key + R 并运行 resmon.exe
。在那里你会发现 VS 声称正在使用该文件的 EXE 进程。右键单击并结束进程。尽管您可能会收到 Access Denied 错误消息,但它会被暂停,您将能够再次构建。
这让我困了两天多,不得不重新克隆项目并以不同的名称保存项目文件夹,但今天我从微软开发论坛找到了解决方案。
解决方案:
通过转到项目属性(在解决方案资源管理器中右键单击项目,然后选择“属性”选项),在项目中创建预构建操作,选择“构建事件”选项卡。添加此代码:
if exist "$(TargetPath).locked" del "$(TargetPath).locked"
if not exist "$(TargetPath).locked" move "$(TargetPath)" "$(TargetPath).locked"
此代码会将文件复制到不同的名称,并允许构建继续成功。
您的网络应用程序是如何配置的?它是在 Cassini(托盘 Web 服务器)还是 IIS 下运行?
这不应该正常发生。我认为 ProcessExplorer 可以告诉您进程锁定了哪些文件。如果不是其他 sysinternals 工具之一,请处理资源管理器。
在下载其中一个 SI 工具之前要尝试的一件事是停止 Cassini Web 服务器,并查看是否可以释放文件。
对我有用的是重新启动 IIS
我也有同样的问题。更改调试/发布配置并没有解决问题。至少不是没有在两者之间建立。
在我的解决方案(winform)中,它是通过在设计器中打开winform的主窗体来解决的。切换到代码 (F7)。然后关闭代码,关闭winform的设计器,全部重建(ctrl-shift-B)。这对我有用。
似乎winform应用程序(运行后台工作程序)中的某种句柄仍然在使用的其他一些库上具有文件句柄。
我有两个 Visual Studio 实例打开了相同的解决方案。
在我的情况下,有一些 vstest 进程正在运行(具有各种名称,但都包含字符串 vstest)。我不得不在 taskmgr 中终止它们。
同样的错误,通过更新 Google Nuget 支持包解决
当我结束进程 .Net Core Host
时,一切正常。我不必关闭 Visual Studio 或更改任何其他内容。
用 Docker 做 VS 开发的朋友,重启 docker for windows 服务,问题立马解决。
在重新启动 docker 之前,我尝试了所有提到的答案,没有找到正在运行的 msbuild.exe 进程,还尝试重新启动 VS 无济于事,只有重新启动 docker 才有效。
另一种解决方案:当文件被锁定时,会报告阻塞进程(类似于“ServiceHub.Host.CLR.x64 (7764)”),其 id 在括号中。要摆脱该进程,请打开 PowerShell (x + Win + I) 并键入:“Stop-Process -Id idNumber”。
我最近在部署到 Service Fabric 时遇到了这个问题。该错误暗示正在使用“文件”,但是,我发现该端口正在被另一个 IDE 使用。通过停止已经在端口上托管的正在运行的服务,我能够阻止此异常的发生。
不定期副业成功案例分享