Visual Studio блокирует выходной файл при сборке
У меня есть простое решение WinForms в VS 2010. Всякий раз, когда я строю его, выходной файл (bindebugapp.exe) заканчивается блокировкой, и последующие сборки завершаются неудачей с сообщением типа
"The process cannot access the file 'binDebugapp.exe' because it is being used by another process."
Единственный способ построить проект-перезапустить VS после каждой сборки, которая очень неловко.
Я нашел этот старый пост в блоге http://blogs.geekdojo.net/brian/archive/2006/02/17/VS2005FileLocking.aspx - кажется, что проблема действительно старая. Кто-нибудь знает, что происходит ли здесь, или хотя бы какой-то обходной путь?
обновление
Я на самом деле не run файл. Блокировка происходит после сборки, а не после отладки (т. е. запуск VS - build - build - fail!)
И я попытался отключить антивирус. Это не помогает.
обновление 2
Process Explorer показывает devenv.exe загрузив файл (в DLL, а не в дескрипторы). Похоже, какой-то глюк во время сборки помешал выгрузка, но (первая) сборка завершается без каких-либо сообщений, кроме "1 succeeded, o failed"/
16 ответов:
была та же проблема, но нашел решение (благодаря Кейван Найери):
но как это решить? Существуют различные способы, основанные на типе проекта, но одно простое решение, которое я рекомендую разработчикам надстроек 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 designer.
обходной путь здесь состоит в том, чтобы переместить заблокированный выходной файл в другой временный в событии предварительной сборки. Имеет смысл генерировать временное имя файла случайным образом.
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 без Права администратора и проблема исчезли!.
Дайте мне знать, если это помогло вам. Удача.
Я видел это либо на жадном программном обеспечении для сканирования вирусов, либо в приложении if.exe не закрывается должным образом. Убедитесь, что процесс еще не запущен.
Как насчет антивирусных сканеров на вашем компьютере? Вы можете видеть любые процессы, которые держат дескрипторы к вашему файлу (используйте Process Explorer узнать)?
может быть, есть "приложение.exe " отображается в списке процессов, т. е. последняя отлаженная версия все еще работает? При разработке приложений, которые имеют несколько потоков, это может произойти, если вы не
joinвсе из них.
У меня была та же проблема, и я узнал, что VS только блокирует exe, когда я открыл форму или UserControl в VS перед построением. Решение было довольно простым, мне просто нужно было закрыть любую форму/UserControl, прежде чем я построю решение, и оно сработало.
существует также известная проблема 533411, где использование автоматического обновления номер сборки может привести к блокировки. Обходной путь от сообщения об ошибке
временное решение будет отключить обновление версии сборки после перестроения. В AssemblyInfo.cs-файл, удалите подстановочный знак из атрибута AssemblyVersion, например:
замените это:
[собрание: AssemblyVersion("1.4.* " )]
[собрание: AssemblyFileVersion("1.4")]
с этим:
[собрание: AssemblyVersion("1.4.0.0")]
[собрание: AssemblyFileVersion("1.4.0.0")]
У меня была эта проблема, и я решил ее с помощью некоторого пользовательского кода. Смотрите здесь: проблемы с блокировкой файлов сборки Visual Studio 2010
скомпилируйте утилиту в принятом ответе и ссылайтесь на нее во время шага сборки, как описано, чтобы обойти проблему. Я все еще выключаю VS 2010 на обед, чтобы очистить утреннюю работу.
причиной пользовательского кода было то, что часто рекомендуемое решение работало только один раз, а затем переименованные файлы также были заблокированы, предотвращение переименования. Здесь мы просто добавляем информацию о времени данных в файл, чтобы переименованные версии не могли конфликтовать.
база на Великом Stormenet ответ, я поставил небольшой скрипт, который должен работать во всех случаях.
вот код, который нужно поместить в текстовое поле события pre build
$(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%"
единственное, что сработало для меня, это выйти из Visual Studio 2012, удалить папки BIN и OBJ для проекта, имеющего проблемы, и снова открыть Visual Studio.
решена... До следующего раза.
Если ваш $(TargetPath) указывает на DLL, которая использует COM, убедитесь, что у вас есть конструктор по умолчанию. Не знаю, почему конструктор по умолчанию не выводится там. Добавление конструктора по умолчанию работало для меня в этом сценарии.
закрытие visual studio, повторное открытие и перезагрузка самое последнее решение работает вокруг проблемы для меня. (Visual Studio 2013 Ultimate)
я столкнулся с тем же самым, разрабатывая приложения xamarin в VS2017.
Это был Защитник Windows, блокирующий exe / dll с помощью devenv.исполняемый.
вы можете пойти, чтобы выиграть защитника и добавить
devenv.exe msbuild.exeв список исключений процесс.
Это решение я узнаю
- снимите флажок с процесса размещения Visual Studio в настройках проекта, как показано ниже
- убить exe . это будет ваше имя приложения.vshost.exe от taskmanager
- Теперь вы можете перестроить приложение и запустить его.
Примечание: Вы можете повторно включить эту опцию снова без проблемы.
мне удалось решить эту проблему, отключив сканирование McAfee LiveSafe в реальном времени. Мой. exe-файл будет заблокирован, как описано в OP, и у меня не будет возможности удалить файл, что означало, что я не мог построить решение. После отключения функции McAfee проблема исчезла.
затем я, конечно, пошел на полное удаление McAfee, который был установлен только потому, что мой компьютер новый, и он пришел с уже установленной программой.



Comments