VS 2010에 간단한 WinForms 솔루션이 있습니다. 빌드 할 때마다 출력 파일 (bin \ debug \ app.exe)이 잠기고 후속 빌드가 실패
"The process cannot access the file 'bin\Debug\app.exe' because it is being used by another process."
하고 프로젝트를 빌드하는 유일한 방법은 VS를 다시 시작하는 것입니다. 모든 빌드는 매우 어색합니다.
이 오래된 블로그 게시물 http://blogs.geekdojo.net/brian/archive/2006/02/17/VS2005FileLocking.aspx를 찾았습니다 . 문제가 정말 오래된 것 같습니다. 여기에서 무슨 일이 일어나고 있는지 또는 적어도 몇 가지 해결 방법을 아는 사람이 있습니까?
최신 정보
실제로 파일을 실행 하지 않습니다 . 잠금은 디버그 후가 아니라 빌드 후에 발생합니다 (예 : VS 시작-빌드-빌드-실패!). 그리고 바이러스 백신을 끄려고했습니다. 도움이되지 않습니다.
업데이트 2
프로세스 탐색기는 파일을로드 한 devenv.exe를 표시합니다 (핸들이 아닌 DLL로). 빌드 중 일부 결함으로 인해 언로드가 차단 된 것처럼 보이지만 (첫 번째) 빌드는 “1 성공, o 실패”이외의 다른 메시지없이 완료됩니다.
답변
같은 문제가 있었지만 해결책을 찾았습니다 ( Keyvan Nayyeri 덕분에 ).
그러나 이것을 해결하는 방법? 프로젝트 유형에 따라 다양한 방법이 있지만 Visual Studio 추가 기능 개발자에게 권장하는 간단한 솔루션 중 하나는 프로젝트의 빌드 이벤트에 간단한 코드를 추가하는 것입니다.
프로젝트의 빌드 전 이벤트 명령 줄에 다음 코드 줄을 추가 할 수 있습니다.
if exist "$(TargetPath).locked" del "$(TargetPath).locked"
if exist "$(TargetPath)" if not exist "$(TargetPath).locked" move "$(TargetPath)" "$(TargetPath).locked"
답변
바이러스 문제가 아닙니다. Visual Studio 2010 버그입니다. Visual Studio GUI 디자이너 사용과 관련된 문제인 것 같습니다.
여기서 해결 방법은 빌드 전 이벤트에서 잠긴 출력 파일을 다른 임시 파일로 이동하는 것입니다. 임시 파일 이름을 임의로 생성하는 것이 좋습니다.
del "$(TargetPath).locked.*" /q
if exist "$(TargetPath)" move "$(TargetPath)" "$(TargetPath).locked.%random%"
exit /B 0
일정한 임시 파일 이름을 사용하는 경우 잠금을 연기합니다.
이 해결 방법은 정확히 한 번만 작동합니다.
if exist "$(TargetPath).locked" del "$(TargetPath).locked"
if exist "$(TargetPath)" if not exist "$(TargetPath).locked" move "$(TargetPath)" "$(TargetPath).locked"
정확히 2 번 작동하는 2 개의 임시 파일이있는 솔루션을 찾았습니다.
답변
나에게도 문제가 발생했습니다.
내 시나리오는 다음과 같습니다. Windows 7 실행 (Windows XP에서도 발생했을 수 있음) 및 WPF 사용자 컨트롤을 사용하여 프로젝트에서 작업하는 동안 사용자 컨트롤의 XAML 파일을 열 때까지 항상 빌드 할 수있었습니다. 빌드가 하나 있고 파일이 잠 깁니다.
또한 관리자 권한 으로 Visual Studio (Devenv.exe)를 실행하고 있음을 알게되었고 관리자 권한없이 Visual Studio를 실행하기 시작했는데 문제가 사라졌습니다! .
도움이되었는지 알려주세요. 행운을 빕니다.
답변
탐욕스러운 바이러스 검사 소프트웨어에서 또는 app.exe가 제대로 종료되지 않는 경우에 이것을 보았습니다. 프로세스가 아직 실행되고 있지 않은지 확인하십시오.
답변
컴퓨터의 바이러스 스캐너는 어떻습니까? 파일에 대한 핸들을 보유하고있는 프로세스를 볼 수 있습니까 ( 프로세스 탐색기 를 사용 하여 확인)?
프로세스 목록에 “app.exe”가 표시 될 수 있습니다. 즉, 마지막으로 디버깅 한 버전이 여전히 실행 중입니까? 여러 스레드가있는 응용 프로그램을 개발할 때 join
모든 스레드가 아닌 경우 이런 일이 발생할 수 있습니다.
답변
나는 같은 문제가 있었고 VS는 빌드하기 전에 VS에서 Form 또는 UserControl을 열 때만 exe를 잠급니다. 솔루션은 매우 쉬웠습니다. 솔루션을 빌드하기 전에 Form / UserControl을 닫아야했고 작동했습니다.
답변
훌륭한 Stormenet 답변을 바탕 으로 모든 경우에 작동하는 작은 스크립트를 작성했습니다.
다음은 사전 빌드 이벤트 텍스트 상자에 입력 할 코드입니다.
$(SolutionDir)\BuildProcess\PreBuildEvents.bat "$(TargetPath)" "$(TargetFileName)" "$(TargetDir)" "$(TargetName)"
다음은 파일에서 복사 할 스크립트 $(SolutionDir)\BuildProcess\PreBuildEvents.bat
입니다 (물론이 경로를 수정할 수 있음).
REM This script is invoked before compiling an assembly, and if the target file exist, it moves it to a temporary location
REM The file-move works even if the existing assembly file is currently locked-by/in-use-in any process.
REM This way we can be sure that the compilation won't end up claiming the assembly cannot be erased!
echo PreBuildEvents
echo $(TargetPath) is %1
echo $(TargetFileName) is %2
echo $(TargetDir) is %3
echo $(TargetName) is %4
set dir=C:\temp\LockedAssemblies
if not exist %dir% (mkdir %dir%)
REM delete all assemblies moved not really locked by a process
del "%dir%\*" /q
REM assembly file (.exe / .dll) - .pdb file - eventually .xml file (documentation) are concerned
REM use %random% to let coexists several process that hold several versions of locked assemblies
if exist "%1" move "%1" "%dir%\%2.locked.%random%"
if exist "%3%4.pdb" move "%3%4.pdb" "%dir%\%4.pdb.locked%random%"
if exist "%3%4.xml.locked" del "%dir%\%4.xml.locked%random%"
REM Code with Macros
REM if exist "$(TargetPath)" move "$(TargetPath)" "C:\temp\LockedAssemblies\$(TargetFileName).locked.%random%"
REM if exist "$(TargetDir)$(TargetName).pdb" move "C:\temp\LockedAssemblies\$(TargetName).pdb" "$(TargetDir)$(TargetName).pdb.locked%random%"
REM if exist "$(TargetDir)$(TargetName).xml.locked" del "C:\temp\LockedAssemblies\$(TargetName).xml.locked%random%"