Проблемы блокировки файла типа "build" Visual Studio 2010

У меня есть проект Visual Studio 2008 года, что я "обновил" до Visual Studio 2010. Начиная с обновления у меня было много проблем с проектом (проект, который был и все еще является солдатом в 2008, я мог бы добавить).

Первая проблема состоит в том, что создание основного исполняемого файла блокирует исполняемый файл, вызывание далее восстанавливает для сбоя. Это описано в связанном вопросе: Visual Studio блокирует выходной файл на сборке, где я взял обходное решение:

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

Кроме этого обходного решения работает точно однажды. .locked файл затем заблокирован devenv.exe также и должен быть перемещен. Я работал вокруг этого путем добавления.1.locked.2.locked, и т.д. Единственное время, когда блокировки удалены так файлы, может быть удалено, находится на завершении работы devenv.exe (оно берет спустя несколько секунд после того, как UI исчезает, затем файлы могут быть удалены).

То, что отладчик не должен использоваться для порождения этой проблемы точки к довольно серьезной проблеме с системой сборки 2010 года.

Некоторые теории я думаю, что могу обесценить:

  • Антивирус или другие фоновые задачи: если бы это было проблемой, то казалось бы, что 2008 перестал бы работать. Однако будучи completest я удалил стой! система полностью без удачи.

ОБНОВЛЕНИЕ: Этот проект имеет те же признаки на машине без антивируса и никакой утилиты резервного копирования. Машины в офисе выполняют XP SP3 32 бита, моя локальная машина является Windows 7 64 бита. Это, кажется, независимо от операционной системы.

  • Отладчик блокирует файл: все, что требуется, чтобы воспроизводить это, повторяет процесс сборки без отладки. ProcessExplorer показывает, что devenv.exe является держателем блокировок, не, vshost и уничтожение vshost.exe не удаляют блокировки так или иначе.

У меня есть вторичная проблема, которая начинает происходить, после того как файлы заблокированы: конструкторы форм прекращают загружаться с, "не может найти блок" ошибкой. Я подозреваю, что они связаны с более ранней проблемой блокировки, поскольку разработчики разжигают прямо до сборки, но вносящий любые изменения и восстановление заставит всех разработчиков выходить из строя с той ошибкой (даже, которые я имею открытый и как текущее представление).

Это жалко для наблюдения формы близко к белому ошибочному экрану просто, потому что Вы изменили "dummy=1" на "dummy=2", где "макет" действительно абсолютно только вызывает перекомпилировать в абсолютно несвязанном блоке.

Обновление: Я попробовал еще несколько средств: Включите исходное продвижение.NET, не проверяется, так, чтобы не была проблема. Удаление.SUO (пользовательские опции решения) просто работает столько, сколько перезапуск обычно удалял бы проблему (две сборки: первое, потому что нет никакого заблокированного файла и второго, потому что существует один, но это может быть переименовано сценарием).

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

21
задан Community 23 May 2017 в 12:00
поделиться

2 ответа

Пока для этого не появится патч, у меня есть следующий обходной путь. Просто вызовите, используя что-то вроде "C: \ MyBin \ VisualStudioLockWorkaround.exe" "$ (TargetPath)" (заменив MyBin на место, где вы размещаете исполняемый файл).

Создайте его как консольное приложение C # и используйте его в разделе «Предварительная сборка» таким же образом, как и исходное переименование перед сборкой (подробности см. В верхней части исходного вопроса).

 using System;
 using System.IO;

 namespace VisualStudioLockWorkaround
 {
  class Program
  {
   static void Main(string[] args)
   {
    string file = args[0];
    string fileName = Path.GetFileName(file);
    string directory = Path.GetDirectoryName(args[0]);
    if (!Directory.Exists(directory)) //If we don't have a folder, nothing to do.
    {
     Console.WriteLine(String.Format("Folder {0} not found. Exiting.", directory));
     return;
    }
    if (!File.Exists(file)) //If the offending executable is missing, no reason to remove the locked files.
    {
     Console.WriteLine(String.Format("File {0} not found. Exiting.", file));
     return;
    }
    foreach (string lockedFile in Directory.EnumerateFiles(directory, "*.locked"))
    {
     try //We know IOExceptions will occur due to the locking bug.
     {
      File.Delete(lockedFile);
     }
     catch (IOException)
     {
      //Nothing to do, just absorbing the IO error.
     }
     catch (UnauthorizedAccessException)
     {
      //Nothing to do, just absorbing the IO error.
     }                                        
    }

    //Rename the executable to a .locked
    File.Move(file, Path.Combine(directory, String.Format("{0}{1:ddmmyyhhmmss}.locked", fileName, DateTime.Now)));
   }
  }
 }
15
ответ дан 29 November 2019 в 21:49
поделиться

Известна ошибка утечки файловых хэндлов в функции шага исходного кода .NET framework. Его легко избежать, отключив опцию в Tools + Options + Debugger. Однако это вряд ли может быть вашей проблемой, если вы так и не запустили отладчик.

Совершенно непонятно, зачем Visual Studio вообще интересоваться выводом сборки, не говоря уже о том, чтобы загружать и блокировать его. Может быть, вы открыли .exe один раз? Для уверенности удалите скрытый файл .suo в каталоге решения. На connect.microsoft.com нет ни одного отчета об обратной связи, который бы соответствовал вашей проблеме, я бы рекомендовал вам начать свой собственный. Им понадобится что-то воспроизводимое, чтобы они могли взглянуть на проблему, убедитесь, что вы включили пример проекта, который демонстрирует такое поведение.

3
ответ дан 29 November 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: