VisualStudio2010调试 - 进程无法访问文件...因为它正由另一个进程使用

时间:2010-04-22 10:54:29

标签: visual-studio-2010 visual-studio debugging

我无法使用Visual Studio 2010教授的发布版调试WinForms C#应用程序。

在第二次调试运行后,我收到以下错误消息。

错误9无法将文件“obj \ x86 \ Debug \ Arrowgrass Reports.exe”复制到“bin \ Debug \ Arrowgrass Reports.exe”。该进程无法访问文件'bin \ Debug \ Arrowgrass Reports.exe',因为它正由另一个进程使用。

我已尝试使用预构建脚本尝试删除此文件,但它已被Visual Studio锁定。

网上有一些引用,所以这是一个已知的问题。有没有人有修补程序或有效的解决方法?

30 个答案:

答案 0 :(得分:29)

我发现这个问题很容易重现,对我来说修复是Richard Fors回答的变种。如果我在设计器中打开了UserControl,运行调试器,然后编辑UserControl,则后续重建将失败。如果我在运行调试器之前关闭UserControl,我永远不会收到此错误,因此我只需确保在按下F5之前关闭设计器窗口。

答案 1 :(得分:27)

截至2012年10月,我仍然遇到此问题,因此VS 2010 SP1无法解决问题。我所做的,并且始终如一地工作,正在禁用项目中的托管过程。

要停用托管流程:

.  Open a project in Visual Studio.

.  On the Project menu, click Properties.

.  Click the Debug tab.

.  Clear the Enable the Visual Studio hosting process check box.

来源: http://msdn.microsoft.com/en-us/library/ms185330(v=vs.100).aspx

答案 2 :(得分:21)

您可以尝试终止vshost.exe进程:

taskkill /F /IM "Arrowgrass Reports.vshosts.exe"

您可能也很幸运,只需移动相关文件即可。移动文件可以通过将以下代码行添加到项目的预构建事件中来完成:

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

答案 3 :(得分:4)

禁用Windows搜索并没有解决我的问题。但是,禁用防病毒软件(我们的防病毒软件是Symantec Endpoint Protection 11)

因此,我能够通过更改项目中的调试设置将工作文件夹指向C:驱动器上的路径,然后从防病毒自动保护扫描设置中除了该路径,从而为自己解决此问题。

我希望这有助于某人。

答案 4 :(得分:4)

我在一个类似的问题中发布了这个答案,但我想也会在这里说:

好吧......这可能听起来很疯狂。

在过去的几年里,我在VS2010中遇到过这个问题。这里提到的解决方法对我有用,但很多时候我忘了先关闭所有表单/用户控件。

我发现只是通过以下方式查看打开的文件:

Computer Management (compmgmt.msc)->Shared Folders->Open Files

将“释放”任何被锁定的文件。很奇怪,但它对我有用!

答案 5 :(得分:2)

在我的情况下,我执行了项目属性 - >安全选项卡 - >取消选中Click-Once安全设置(如果已选中)。它对我有用。在我的项目中,它显示了在我的C#项目中使用的C ++ DLL的错误。

答案 6 :(得分:1)

我不能'写入评论,因为不是在50分,但对我来说,我在ESET Enpoint Security ver 5中排除了我的项目文件夹。似乎它阻止/阻塞了一些文件。我的错误没有说明哪个exe或文件正在使用,所以花了很长时间才终于得到JoeC所说的关于Antivirus并试了一下。似乎现在正在工作(Visual Studio 2010 SP1)

答案 7 :(得分:1)

最近更改了用户控件,解决了我的方案中的问题。希望这会帮助那里的人。

答案 8 :(得分:1)

检查任务管理器以查找指定的进程并显式结束进程。这个解决方案对我有用。

答案 9 :(得分:1)

我在开发Windows服务时遇到了这个问题。我发现它在服务运行时发生。因此,您只需要停止服务(来自services.msc控制台),您就可以开始了!

希望这会有所帮助。 蒂贾尼。

答案 10 :(得分:1)

得到错误("当我从两个大的源代码修改(Visual Studio 2010 C#Express with SP1)解决方案时,进程无法访问该文件...因为它正被另一个进程使用#34;)文件,每个文件大约500行)一个引用另一个的项目,大量(6)小项目,其中有很多项目引用其他项目。

引用是dll-和exe文件(它们的Debug版本),而不是项目,即使项目在同一个解决方案中。

然后我了解到引用应该是项目,而不是文件,以使F12正常工作。所以我修改了引用。这使得F12工作(跳转到源文件而不是一些自动生成的接口描述),同时"无法访问文件"构建过程中的错误消失了。

我只得到"无法访问文件"执行发布版本时出错。引用的是exe / dll的Debug版本。我怀疑这种混合是触发VS中的错误的原因。

答案 11 :(得分:1)

所描述的条件也可能由违规的DLL或EXE引用本身引起;在这种情况下,前面描述的Process Explorer测试永远不会返回匹配(例如,它没有运行)。这种意想不到的情况似乎是在VS2010(以及可能以前的所有版本)中的一些操作序列中引起的,这些操作在后台隐藏地添加了引用。其具体原因尚未被追踪(或我已知的解决)。要检查并解决此错误,只需确保违规DLL或EXE未列为对自身的引用。

答案 12 :(得分:0)

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

从字面上删除了关于自定义控件的完整源代码,最后一个问题从未停止过,直到我检查了引用并且引用自身以便“能够”获得以前的自定义控件。我删除了引用并完成了!!

所以:只需检查引用并删除对项目的自引用。

答案 13 :(得分:0)

当项目在远程共享上时,我遇到了这个错误(例如,如果您的$ env:homepath被IT部门有效地重定向到网络共享)。确保您的项目驻留在本地驱动器上。

答案 14 :(得分:0)

删除Bin文件夹并运行该应用程序。 这对我有用。 :)

答案 15 :(得分:0)

对我有用的是删除"只读" bin文件夹上的状态。一旦我这样做,它一直有效。

答案 16 :(得分:0)

如果您正在使用使用C DLL引用的C#项目,则可以通过选中“允许不安全代码”复选框来消除错误。我知道我在C#项目中没有使用过指针,但我在C#中使用了一些按位运算符。可能是这些类似C的功能将其变形为“不安全”代码。

答案 17 :(得分:0)

只需在调试中关闭Visual Studio主机,运行项目并再次重新启动它并运行项目。

在Visual Studio中打开一个项目。

。在项目菜单上,单击属性。

。单击“调试”选项卡。

。清除“启用Visual Studio宿主过程”复选框

答案 18 :(得分:0)

对我来说,最好的解决方案是将我的项目文件移出My Documents(位于IT部门管理的服务器上),并在我的C盘上本地找到它们。还可以工作:取消选中"启用Visual Studio托管流程"复选框,正如其他人所说。

答案 19 :(得分:0)

对于Windows项目

Visual Studio托管进程可以保存可执行文件指针。要停止主机实例,请打开Project properties,然后转到Debug标签。现在取消选中Enable the Visual Studio hosting Process选项,然后再次选中复选框进行调试。

对于Web项目

IIS可以保存文件指针。重新启动IIS可以解决问题。

答案 20 :(得分:0)

删除obj文件。然后停止服务并重新启动。然后您可以解决问题

答案 21 :(得分:0)

尝试在debug或release文件夹中删除.exe文件(无论你在做什么) Windows将提示进程X已打开此进程,您无法将其删除 之后转到任务管理器并在详细信息选项卡中结束任务X进程

答案 22 :(得分:0)

我的问题是Outlook 2010(outlook.exe)使用与IIS Express的ASP.NET MVC项目相同的端口。

解决方案:关闭outlook.exe,运行您的解决方案并再次打开Outlook(以便它使用另一个端口)。

希望这有助于某人,因为我收到了与本主题中描述的相同的错误消息。

答案 23 :(得分:0)

停止IIS服务并尝试再次构建它,或者如果您能够重新启动电脑,请尝试一下。两种方式都为我工作。

干杯

答案 24 :(得分:0)

只需复制整个项目并从新副本运行项目....它将正常工作。 但是你必须以某种方式结束调试过程才能删除旧项目。

答案 25 :(得分:0)

将以下内容添加到共享dll的预构建事件中对我有用:

if exist "$(TargetPath).locked*" del "$(TargetPath).locked*"
set exitprebuildfor$(ProjectName)=
for /l %%a in (1,1,10) do (
  if defined exitprebuildfor$(ProjectName) goto :ok
  if not exist "$(TargetPath).locked%%a" if exist "$(TargetPath)" move "$(TargetPath)" "$(TargetPath).locked%%a" & set exitprebuildfor$(ProjectName)=1)
:ok
set exitprebuildfor$(ProjectName)=

它基于给定here的解决方案,但不是将dll重命名为.locked,而是继续尝试将其重命名为.locked1,locked2。使用10我通常每天遇到一次问题,但可以使用蚂蚁值。

答案 26 :(得分:0)

对我来说,解决方案是将启动项目更改为dll(当应用程序作为启动项目时,问题仅发生在调试模式中)。如果您的解决方案包含多个项目(并且它将包含.dll,否则您将无法解决问题),切换到.dll,没有.vshost.exe,没问题。

另外,杀死.vshost.exe对我来说不起作用,因为在重新启动之后,它已经锁定了.dll。

此外,请确保您的引用清晰,特别是在更复杂的项目中,并且还更喜欢对程序集引用的项目引用,等等。我认为不好的引用(循环和类似的)必然会引起问题,至少我已经读过了。

A short article by me on this problem (and my solution)

How to "clean up" your references in a solution

答案 27 :(得分:0)

我想我刚刚找到了罪魁祸首和解决方案。

转到服务并停止&禁用“Windows搜索”服务。

现在我解决了这个问题。

答案 28 :(得分:0)

请尝试卸载Windows Live SYNC。它还会发生吗?

答案 29 :(得分:0)