Visual Studio «Не удалось скопировать»… во время сборки


347

Я продолжаю получать эту ошибку во время сборки моего проекта VS2012 C #

Error   41  Could not copy "obj\Debug\WeinGartner.WeinCad.exe" to
 "bin\Debug\WeinGartner.WeinCad.exe". 
 Exceeded retry count of 10. Failed.    


Error   42  Unable to copy file "obj\Debug\WeinGartner.WeinCad.exe" to
"bin\Debug\WeinGartner.WeinCad.exe". The process cannot access the file
'bin\Debug\WeinGartner.WeinCad.exe' because it is being used by another 
process.    

Теперь я понял, что убивает процесс

Weingartner.WeinCad.vhost.exe

работает (иногда) но это действует мне на нервы. Есть ли способ остановить это вообще?

Мои настройки отладчика

введите описание изображения здесь введите описание изображения здесь


Для меня это было вызвано запуском вручную .exe в каталоге Release. Проблема заключалась в том, что VS не может скопировать исполняемый файл, который все еще работает. Я постараюсь исправить это с помощью правильной очистки ресурсов, чтобы программа не оставляла зависание после кнопки закрытия окна.
lahjaton_j

Есть хорошее резюме этой проблемы с типичными шагами, чтобы решить в этом вопросе
LightCC

Это происходило для меня, потому что Защитник Windows решил, что ему больше не нравится .exe из проекта VS2019, над которым я работаю. Работали над этим неделями без проблем, но сегодня, думаю, новое обновление не понравилось. Пришлось исключить мои исходные папки. Перестало происходить.
IronRod

Ответы:


401

Я встречал похожие сообщения об ошибках в Visual Studio 2013.

В основном я обнаружил, что такая ситуация возникла, когда процесс отладки был остановлен из-за исключения.

Когда clean + build не решил эту проблему для меня, я добился успеха, выполнив следующие действия:

  • Закрытие Visual Studio
  • Удаление binи objпапки, и
  • Повторное открытие Visual Studio.

Эта «ошибка» существует со времен Visual Studio 2003.

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


8
То же самое здесь, VS2013. Выход, удаление артефактов сборки, перезапуск -> все хорошо.
Какау

49
У меня та же проблема, но после перезапуска VS я получаю одну сборку, и файлы снова блокируются ..
Sonic Soul

54
Это не решение, в лучшем случае частичное решение. Я не хочу перезапускать VS каждые 10 минут. Очистка раствора работает для меня, но очистка каждые 10 минут также не является решением.
Легенды

7
Исходя из моего опыта, VS2013 делает это по крайней мере 10 раз в день для меня, независимо от того, на какой машине я работаю. Это как ошибка стала хуже. Просто говорю
AR

28
ошибка все еще существует в VS 2019.
Akash KC

107

В Visual Studio Premium 2013 (обновление 3) я решил эту проблему с помощью предварительной сборки одной строки:

(if exist "$(TargetDir)*old.pdb" del "$(TargetDir)*old.pdb") & (if exist "$(TargetDir)*.pdb" ren "$(TargetDir)*.pdb" *.old.pdb)

Это изящно удаляет все старые файлы PDB (если это возможно), а затем переименовывает все, что осталось с .old.pdbрасширением. Приятным побочным эффектом является то, что если старая PDB все еще заблокирована, она просто добавляет еще один элемент .old к имени файла, и все они очищаются при следующем перезапуске Visual Studio и выполнении сборки.

Например, сеанс сборки / отладки 1 остается MyProject.pdbзаблокированным.
В следующий раз вы построите:
MyProject.pdb->MyProject.old.pdb

Затем запускается сеанс сборки / отладки 2, и оба так MyProject.pdb и MyProject.old.pdbостаются заблокированными:
MyProject.old.pdb-> MyProject.old.old.pdb
MyProject.pdb->MyProject.old.pdb

Наконец, перезапуск Visual Studio и создание новой сборки избавят от обоих этих факторов и продолжат процесс как обычно.


5
То же самое в VS2010, VS 2012
Boogier

7
Спасибо, отлично сработал для меня, изменив ваш пример на использование exe-файлов. Я думаю, что это может быть ошибкой и в последней версии ОС 2015 года.
Джонни Сковдал

Рад, что это помогло - у меня все еще есть настроенная команда перед сборкой, и она работает достаточно хорошо, чтобы я забыл, что она была там!
Джефф

3
Я ненавижу делать это по принципу, но это работает, так что вот так! :) Спасибо, что поделились этой жемчужиной, Джефф!
kayleeFrye_onDeck

1
Последний (2018-03-11) Visual Studio 2017 v15.6.1: по-прежнему проблема. Отладка, исключение, сборки в целевом каталоге заблокированы. Приведенное выше решение с * .pdb, измененным на * .dll, все еще применяется.
Michiel de Wolde

71

Это потому, что вы закрыли свое приложение, но оно все еще работает в фоновом режиме.

Временное решение:

  • Перейти к диспетчеру задач ( Ctrl+ Alt+ Esc).
  • Перейдите на вкладку «Процессы» и найдите «YourProjectName.exe».
  • Установите флажок «Показать процессы от всех пользователей», если вы не можете найти свой процесс.
  • Завершить процесс.

Постоянное решение: вы должны закрыть приложение через кодирование. Вот код ...

System.Windows.Forms.Application.Exit();

Вы должны поместить этот код в событие закрытия формы во всей форме. Пример:

private void frm_menu_FormClosing(object sender, FormClosingEventArgs e)
{
    System.Windows.Forms.Application.Exit();
}

1
Это было именно так. Сбой Visual Studio, и IIS Express все еще работает (в моем случае). Все, что мне нужно было сделать, это открыть панель задач, щелкнуть правой кнопкой мыши значок IIS Express и выйти. Спасибо.
Ник

Это сработало для меня; Я не мог удалить папки obj и bin, так как их использовал другой процесс. К счастью, Windows 10 на самом деле сказала, как она называется; как только он был закрыт в диспетчере задач, проблемы исчезли
Novastorm

25

.vhost.exe - это процесс отладчика, поэтому кажется, что отлаживаемый процесс не закрылся должным образом. Скорее всего, у вас есть ошибка, которая поддерживает ее и неправильно останавливает процесс отладки - есть варианты отсоединения от процесса, когда вы нажимаете «остановить отладку» вместо того, чтобы фактически убить отладчик, так что, возможно, у вас есть этот набор.

Но это проблема - файл, который вы пытаетесь скопировать, заблокирован (то есть все еще используется) операционной системой, поэтому он предотвращает копирование. Убедитесь, что файл бесплатный, и вы сможете копировать.


Я добавил свои варианты отладчика к вопросам. Я почти уверен, что это должно убить процесс, но, возможно, я не понимаю некоторые варианты.
Bradgonesurfing

В Visual Studio 2019, я получаю похожее сообщение, хотя теперь он упоминает процесс в некоторых выходных данных (не во всех). Это был testhost.x86.exe, через который мне пришлось убить Task Manager. После этого он, похоже, перестал обнаруживать один из процессов тестирования.
Андез


20

Вы должны отключить антивирус (особенно, если это Avast) и повторить попытку. Это помогло мне. Проблема заключается в том, что отладчик / сборщик создает файл .exe, который определен Avast как угроза, и поэтому удаляется непосредственно перед его выполнением VS.


Хороший улов. Я всегда ненавижу Avast.
stackunderflow

Avast был проблемой и для меня. Отключение File System Shield было ответом. Я попытался добавить папку Visual Studio \ Projects в исключения, но это не сработало.
KeithB

1
У меня та же проблема с защитой Symantec Endpoint. Кто-то в ИТ-отделе довольно сильно повысил уровень безопасности :-) Спасибо, Питерс.
ssimm

Я добавлю, что вы можете создать исключение для каталога obj \ Debug для удобного использования, вместо отключения AV или одного из его защитных инструментов.
А. Кали

Спасибо! Я обнаружил, что это был MalwareBytes, блокирующий мой файл .exe.
NL3294

15

Я смог исправить эту проблему (VS 2010), предоставив следующие действия перед сборкой;

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

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

1
@luckyluke, в свойствах вашего проекта есть раздел, куда вы можете добавить скрипт pre-Build. Скопируйте и вставьте вышеупомянутый скрипт в указанной области и
Nair

13

Quote:

Обходной путь должен поместить это в свойство командной строки события Pre-build проекта> (во вкладке Events build):

Фрагмент кода

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

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

8

исключение

В некоторых случаях в Visual Studio, когда вы (Build || Rebuild) поверх запуска IISExpress, вы сталкивались с этим исключением:

Не удалось скопировать файл "obj \ Debug \ YourProjectName.dll" в bin \ YourProjectName.dll ". Процесс не может получить доступ к файлу" bin \ YourProjectName.dll ", так как он используется другим процессом

Решение

  1. Щелкните правой кнопкой мыши по веб-проекту, который нужно построить.
  2. Нажмите на свойства.
  3. Выберите вкладку Build Events с левой стороны.
  4. В командной строке Pre-build events вставьте эти 2 строки:
tasklist /fi "imagename eq iisexpress.exe" |find ":" > nul
if errorlevel 1 taskkill /f /im "iisexpress.exe"

Вы хороши 2 GO!


6

Похоже, что при изменении имени сборки проект решает проблему.

Так что вместо этого

введите описание изображения здесь

Я изменил это на это

введите описание изображения здесь

Обратите внимание, что я просто изменил его с Increment and Recallна Increment_Recall, я просто удалил пробелы. Теперь он работает нормально для меня.


6

Завершение процесса w3wp.exe (IIS) часто решает эту проблему.
Как правило, вы можете узнать процесс, который заблокировал файл, перейдя в папку bin и попытавшись удалить ее. Сообщение об ошибке, которое появится, если другой процесс использует его, будет содержать имя процесса, который необходимо уничтожить.


4

Я столкнулся с той же проблемой на VS 2012 Версия 11.0.60610.01 Обновление 3 на Windows 8

Дизайнерских окон не было открыто, и проект представлял собой простое консольное приложение.

Удаление процесса vshost, обращающегося к файлу, не работает большую часть времени, так как процесс не обращается к файлу.

Самый простой обходной путь, который работает и занимает наименьшее количество времени, - это удалить проект из решения, построить другой проект в решении и затем добавить исходный результат.

Это раздражитель и пустая трата времени, но это наименее дорогой из всех других вариантов, которые я знаю.

Надеюсь это поможет...


Все, что вам нужно сделать, это восстановить все, и все в порядке еще 10 попыток. Не так много неудобств.
Скотт Шоу-Смит

@ Скотт Шоу-Смит не работает для меня. И основываясь на некоторых других комментариях, которые я видел, это не работает и для других. В моем случае удаление Avast исправило это.
user316117

4

Я думаю, что решил эту проблему, сняв флажок Break all processes when one process breaksв параметрах отладки (первый снимок экрана -> второй вариант).
Некоторое время он строился / работал хорошо, так как я снял его.
В моем проекте используются элементы управления MySql NET Connector и DevExpress. Может быть, один из них не выбрасывал связи, привязки и т. Д., Потому что этот флаг активирован.

Отредактировано: определенно это работает! Больше нет «Невозможно скопировать файл» и больше нет ошибок дизайнера форм.


1
Ни одно из других решений не помогло мне. Это единственный. Я использую Visual Studio 2017 13.2
xleon

4

Добавьте в pre-build событие вашего мастер-проекта taskkill / f / fi "pid gt 0" / im "YourProcess.vshost.exe"


Не очень нравится решать проблему таким образом, но это сработало!
Петтер Т

Я нашел это самое простое рабочее решение проблемы.
Заряд

4

Мой вклад в 10 центов.

Я до сих пор иногда сталкиваюсь с этой проблемой в VS 2015 Update 2.

Я обнаружил, что переключение цели компиляции решает проблему.

Попробуйте это: если вы находитесь в DEBUG, переключитесь на RELEASE и соберите, затем вернитесь к DEBUG. Проблема ушла.

Стефано


Да! Вот и все. Это простое решение этой надоедливой проблемы! Полностью работал для меня. Легко и быстро! Большое спасибо.
Майстер Шницель

1
Меня устраивает! Подсказка: при отключенной отладке >> Параметры >> Отладка >> Общие >> «Использовать режим управляемой совместимости» обходной путь не требуется!
leon22

4

Выполните следующие шаги

  1. Открыть диспетчер задач (Ctrl + Alt + Delete)
  2. На вкладке « Быстродействие » выберите « ProjectNameOfYours.exe» .
  3. Нажмите на Завершить процесс.
  4. Теперь создайте решение.

Вышеуказанные шаги исправили ошибку навсегда :)


4

Если ни один из ответов не работает, попробуйте эту простую проверку. Найдите для любого MSbuild.exe работающего и удерживающего ваш EXE-файл проекта. Убейте MSBuild.exe и вам будет хорошо идти.


2

Я не могу дать решение, чтобы предотвратить это, но вы можете, по крайней мере, переименовать заблокированный файл (проводник Windows или классическое командное окно), а затем скомпилировать / собрать. Нет необходимости перезагружать или перезагружать VS201x. Имея некоторый опыт, вы можете добавить сценарий предварительной сборки, чтобы удалить старые файлы или переименовать, а затем удалить его в случае блокировки.


2

Смотрите этот другой ответ . По сути, вы могли бы запускать процессы MSBuild.exe в фоновом режиме, используя файлы ресурсов. Если у вас есть какие-либо задачи до или после сборки, из-за которых MSBuild запускается через командную строку, попробуйте добавить к этой команде флаг «/ nr: false». Но опять же, смотрите предыдущий ответ для более подробной информации.


Snap, у меня та же проблема в обновлении 2 VS2015 - MSBuild, процесс exe должен быть уничтожен в TaskManager, прежде чем я смогу перестроить его.
Ник Райт

Ссылка на статью в ответе Джоша выше предлагает использовать системную переменную среды, чтобы отключить повторное использование узлов в Visual Studio и процессе MSBuild (MSBUILDDISABLENODEREUSE = 1) - это сработало для меня.
Ник Райт

2

Я наконец то как это исправить. Почему мы не можем продолжить отладку после первой отладки, потому что первый exe отладки все еще работает. Чтобы после первой отладки вам нужно было перейти в Диспетчер задач -> Вкладка «Процесс» -> [имя вашего проекта exe] и завершить процесс exe.

меня устраивает :)


Вау, спасибо, мужик, именно моя проблема. Поскольку он спрашивает пароль пользователя для меня при запуске exe, в первый раз он не сработал. Когда я пытаюсь удалить это приложение в списке процессов, а затем снова выполнить отладку, это работает безупречно.
Чандрапракаш

2

Ответ @ Джеффа ( https://stackoverflow.com/a/25251766/3739540 ) хорош, но выдает код ошибки 1 при перекомпиляции.

Вот что у меня сработало (2> nul 1> nul на конце + выход 0):

(if exist "$(TargetDir)*old.pdb" del "$(TargetDir)*old.pdb") & (if exist "$(TargetDir)*.pdb" ren "$(TargetDir)*.pdb" *.old.pdb) 2>nul 1>nul
(if exist "$(TargetDir)*old.dll" del "$(TargetDir)*old.dll") & (if exist "$(TargetDir)*.dll" ren "$(TargetDir)*.dll" *.old.dll) 2>nul 1>nul
exit 0

2

Если вы отлаживаете шаблоны T4 , это происходит постоянно. Мое решение (до того, как MS исправит это) было бы просто убить этот процесс:

Диспетчер задач -> Пользователь -> T4VSHostProcess.exe

Этот процесс запускается только при отладке шаблона T4, а не при его запуске.


2

Вот сценарий, чтобы определенно избавиться от этой проблемы:

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 and 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%"

REM PreBuildEvent code
REM   $(SolutionDir)\BuildProcess\PreBuildEvents.bat  "$(TargetPath)"  "$(TargetFileName)"  "$(TargetDir)"  "$(TargetName)"

REM References:
REM   http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx
REM   http://stackoverflow.com/a/2738456/27194
REM   http://stackoverflow.com/a/35800302/27194

Сценарий должен вызываться из каждого события предварительной сборки проекта VS.

$(SolutionDir)\BuildProcess\PreBuildEvents.bat  "$(TargetPath)"  "$(TargetFileName)"  "$(TargetDir)"  "$(TargetName)"

введите описание изображения здесь


2
  1. Открыть свойства проекта [меню> проект> свойства]
  2. Выберите вкладку «отладка»
  3. Снимите флажок «Включить процесс размещения визуальной студии»
  4. Начать отладку [F5]
  5. Вы получите предупреждение системы безопасности, просто «хорошо». Позволяет приложению работать
  6. Прекратите отладку.
  7. Установите флажок «Включить процесс размещения Visual Studio» на вкладке отладки,
  8. Теперь попробуйте начать отладку, вы больше не увидите ошибку

[Работа для меня]


Почему это было в -2? Это сработало и для меня. Это имеет нулевой смысл, но эй, если это работает, это работает.
Wakka02

Это постоянное решение? то есть вы должны делать эти 8 шагов каждый раз?
Артур Свилс

vs17 не имеет опцию процесса хостинга
Джон Деметриу

1

Этот вопрос был первым результатом при поиске следующей ошибки:

Не удалось скопировать файл "...", поскольку он не был найден.

при сборке в Visual Studio 2013 (обновление 3).

Решение: удаление «Power Tools» в Visual Studio 2013.

https://connect.microsoft.com/VisualStudio/feedback/details/533411


Получение этой ошибки много раз при сборке для унаследованного проекта из TFS. Думал, что это было это! Искал это в установленных программах и надстройках. Не удается найти это приложение электроинструмента. Где бы это спрятаться?
Таэрсиус

1

В моем случае это был бегун Resharper Unit Tests (плюс тесты NUnit, у которых никогда не было такой проблемы с MsTests). Убив процесс, смог перестроить процесс, не перезагружая ОС или VS2013


Да, ищитеJetBrains.Resharper.TaskRunner.*
Дунк

1

Я не осознавал, что мой отладчик все еще подключен и пытался встроить тот же экземпляр Visual Studio. Когда я остановил отладчик, я смог его собрать.


1

Убийство процесса (ов) vstest.executionengine.exe решает эту проблему для меня 90% времени. Если это не сработает, то также убивает QTAgent32.exe и затем удаляет папки / bin и / obj для рассматриваемого проекта.

Это самая раздражающая часть моего рабочего дня. :)


1

Для меня это был антивирус Avast, который не позволял Visual Studio записывать / читать / выполнять файл. Поэтому мне пришлось добавить папку Visual studio 2010/2012 в список исключений антивируса. И сразу после этого баама ... это работает.


1

Убедитесь, что вы закрыли все экземпляры wcfSvcHost и попробуйте снова. Это сработало для меня!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.