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"/

1000   16  

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)"

Pre build event

вот скрипт для копирования в файл $(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

в список исключений процесс.

Это решение я узнаю

  1. снимите флажок с процесса размещения Visual Studio в настройках проекта, как показано ниже

enter image description here

  1. убить exe . это будет ваше имя приложения.vshost.exe от taskmanager

enter image description here

  1. Теперь вы можете перестроить приложение и запустить его.

Примечание: Вы можете повторно включить эту опцию снова без проблемы.

мне удалось решить эту проблему, отключив сканирование McAfee LiveSafe в реальном времени. Мой. exe-файл будет заблокирован, как описано в OP, и у меня не будет возможности удалить файл, что означало, что я не мог построить решение. После отключения функции McAfee проблема исчезла.

затем я, конечно, пошел на полное удаление McAfee, который был установлен только потому, что мой компьютер новый, и он пришел с уже установленной программой.

Я создал новое пустое решение и добавил в него все старые файлы. Это как-то решило проблему.

Comments

    Ничего не найдено.