Mam proste rozwiązanie WinForms w VS 2010. Za każdym razem, gdy je buduję, plik wyjściowy (bin \ debug \ app.exe) zostaje zablokowany, a kolejne kompilacje kończą się niepowodzeniem z komunikatem typu
"The process cannot access the file 'bin\Debug\app.exe' because it is being used by another process."
Jedynym sposobem na zbudowanie projektu jest ponowne uruchomienie VS po każdą kompilację, co jest bardzo niezręczne.
Znalazłem ten stary wpis na blogu http://blogs.geekdojo.net/brian/archive/2006/02/17/VS2005FileLocking.aspx - wygląda na to, że problem jest naprawdę stary. Czy ktoś wie, co się tutaj dzieje, a przynajmniej jakieś obejście?
Aktualizacja
W rzeczywistości nie uruchamiam pliku. Blokowanie następuje po kompilacji, a nie po debugowaniu (tj. Uruchomieniu VS - kompilacja - kompilacja - niepowodzenie!). Próbowałem wyłączyć program antywirusowy. To nie pomaga.
Zaktualizuj 2
Process Explorer pokazuje, że devenv.exe załadował plik (w bibliotekach DLL, a nie w uchwytach). Wygląda na to, że jakiś błąd podczas kompilacji uniemożliwił wyładowanie, ale (pierwsza) kompilacja kończy się bez żadnych komunikatów innych niż „1 powiodło się, o nie powiodło się” /
źródło
Odpowiedzi:
Miałem ten sam problem, ale znalazłem rozwiązanie (dzięki Keyvan Nayyeri ):
Ale jak to rozwiązać? Istnieją różne sposoby w zależności od typu projektu, ale jednym prostym rozwiązaniem, które polecam programistom dodatków programu Visual Studio, jest dodanie prostego kodu do zdarzeń kompilacji projektu.
Możesz dodać następujące wiersze kodu do wiersza polecenia zdarzenia przed kompilacją projektu.
źródło
if exist "$(TargetDir)$(TargetName).pdb.locked" del "$(TargetDir)$(TargetName).pdb.locked"
,if exist "$(TargetDir)$(TargetName).pdb" if not exist "$(TargetDir)$(TargetName).pdb.locked" move "$(TargetDir)$(TargetName).pdb" "$(TargetDir)$(TargetName).pdb.locked"
To nie jest problem z wirusami. Jest to błąd programu Visual Studio 2010. Wygląda na to, że problem jest związany z korzystaniem z Visual Studio GUI Designer.
Sposób obejścia tego problemu polega na przeniesieniu zablokowanego pliku wyjściowego do innego tymczasowego w zdarzeniu przed kompilacją. Sensowne jest losowe generowanie tymczasowej nazwy pliku.
W przypadku używania stałych tymczasowych nazw plików po prostu odłożysz blokady:
To obejście działa dokładnie raz
Znalazłem również rozwiązanie z 2 plikami tymczasowymi, które działa dokładnie 2 razy.
źródło
del "$(TargetPath).locked.*" /q if exist "$(TargetPath)" move "$(TargetPath)" "$(TargetPath).locked.%random%" del "$(TargetDir)$(TargetName).pdb.locked.*" /q if exist "$(TargetDir)$(TargetName).pdb" move "$(TargetDir)$(TargetName).pdb" "$(TargetDir)$(TargetName).pdb.locked.%random%" exit /B 0
Problem też przyszedł mi do głowy.
Mój scenariusz był taki: Uruchamianie systemu Windows 7 (ale mogło się to również zdarzyć w systemie Windows XP) i podczas pracy nad projektem z kontrolą użytkownika WPF mogłem budować cały czas, aż do otwarcia pliku XAML kontroli użytkownika - stamtąd, ja ' Mam jedną kompilację, a następnie pliki są zablokowane.
Zauważyłem również, że jako administrator uruchomiłem Visual Studio (Devenv.exe), zacząłem uruchamiać Visual Studio bez uprawnień administratora i problem zniknął! .
Daj mi znać, jeśli tobie też pomogło. Powodzenia.
źródło
Widziałem to na chciwym oprogramowaniu do skanowania antywirusowego lub jeśli app.exe nie zamyka się poprawnie. Upewnij się, że proces nie jest nadal uruchomiony.
źródło
A co ze skanerami antywirusowymi na twoim komputerze? Czy widzisz procesy, które trzymają uchwyty do twojego pliku (użyj Process Explorer, aby się tego dowiedzieć)?
Może na liście procesów widoczny jest plik „app.exe”, tj. Ostatnia wersja, którą debugowałeś, nadal działa? Podczas tworzenia aplikacji, które mają wiele wątków, może się tak zdarzyć, jeśli nie
join
wszystkie z nich.źródło
Miałem ten sam problem i dowiedziałem się, że VS blokuje exe tylko wtedy, gdy otworzyłem Formularz lub UserControl w VS przed budowaniem. Rozwiązanie było dość łatwe, po prostu musiałem zamknąć dowolny Form / UserControl przed zbudowaniem rozwiązania i zadziałało.
źródło
Oprzyj się na wspaniałej odpowiedzi Stormenet , kładę się mały skrypt, który powinien działać we wszystkich przypadkach.
Oto kod, który należy umieścić w polu tekstowym zdarzenia przed kompilacją
Oto skrypt do skopiowania w pliku
$(SolutionDir)\BuildProcess\PreBuildEvents.bat
(oczywiście możesz zmodyfikować tę ścieżkę):źródło
Istnieje również znany problem 533411, w którym użycie automatycznej aktualizacji numerów kompilacji może spowodować problem z blokowaniem. Obejście problemu z raportu o błędzie
źródło
Miałem ten problem i rozwiązałem go za pomocą niestandardowego kodu. Zobacz tutaj: Problemy z blokowaniem plików kompilacji programu Visual Studio 2010
Skompiluj narzędzie w zaakceptowanej odpowiedzi i odwołaj się do niego podczas kroku kompilacji zgodnie z opisem, aby obejść problem. Nadal wyłączam VS 2010 w porze lunchu, żeby posprzątać poranną pracę.
Przyczyną powstania kodu niestandardowego było to, że często zalecane rozwiązanie działało tylko raz, a następnie pliki o zmienionych nazwach zostały również zablokowane, uniemożliwiając zmianę nazwy. Tutaj po prostu dołączamy informacje o czasie do pliku, aby wersje o zmienionych nazwach nie powodowały konfliktów.
źródło
Jedyną rzeczą, która zadziałała, było zamknięcie programu Visual Studio 2012, usunięcie folderów BIN i OBJ dla projektu, w którym występują problemy, i ponowne otwarcie programu Visual Studio.
Problem rozwiązany ... Do następnego razu.
źródło
Jeśli $ (TargetPath) wskazuje na bibliotekę DLL, która używa modelu COM, upewnij się, że masz domyślny konstruktor. Nie wiem, dlaczego domyślny konstruktor nie jest tam wywnioskowany. Dodanie domyślnego konstruktora zadziałało w tym scenariuszu.
źródło
Zamknięcie Visual Studio, ponowne otwarcie i ponowne załadowanie najnowszego rozwiązania rozwiązuje ten problem. (Visual Studio 2013 Ultimate)
źródło
Natknąłem się na to samo, tworząc aplikacje Xamarin w VS2017.
Zdarzyło się, że program Windows Defender blokował exe / dll za pomocą devenv.exe.
Możesz przejść do Win Defender i dodać
do listy wykluczeń procesów.
źródło
To jest rozwiązanie, które znalazłem
Uwaga: możesz ponownie włączyć tę opcję bez żadnych problemów.
źródło
Udało mi się rozwiązać ten problem, wyłączając skanowanie w czasie rzeczywistym za pomocą McAfee LiveSafe. Mój plik .exe blokował się, jak opisuje OP, i nie miałbym możliwości usunięcia pliku, co oznaczało, że nie mogłem zbudować rozwiązania. Po wyłączeniu funkcji McAfee problem zniknął.
Następnie oczywiście całkowicie odinstalowałem McAfee, który został zainstalowany tylko dlatego, że mój komputer jest nowy i miał już zainstalowany program.
źródło
Utworzyłem nowe, puste rozwiązanie i dodałem do niego wszystkie stare pliki. To jakoś rozwiązało problem.
źródło