TFSBuild 2010: фрагменты файла File.Copy c # выдают исключение после компиляции - PullRequest
3 голосов
/ 25 ноября 2011

В TFS Build 2010 у меня запущен процесс сборки devenv.com для нескольких проектов. После этого я хочу, чтобы все двоичные файлы были скопированы из выходных папок с помощью C # Custom Build Activity с помощью «File.Copy». Тем не менее, это бросило мне это исключение с первой копией файла:

The process cannot access the file 'C:\Test\BuildServer\Sources\Library\LibraryInstall\LibraryInstall\Release\LibraryInstall.msm' because it is being used by another process.

Кажется, файл все еще используется devenv.com. Есть идеи как? Кроме File.Copy, есть ли лучший способ скопировать его независимо от статуса файла?

======

Я нашел уродливый путь:

Process proc = new Process();
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.FileName = @"C:\WINDOWS\system32\xcopy.exe";
proc.StartInfo.Arguments = "/Y " + Path.Combine(sourcesDirectory, fileName) + " " + binariesDirectory;
proc.Start();

Ответы [ 2 ]

0 голосов
/ 26 января 2012

У меня мало любительских вещей.Не ставьте минус на мой ответ =)

Сначала взгляните на этот ответ , чтобы немного изменить свой алгоритм

  • Выможет создать пакетный файл, который включает в себя тот же самый уродливый метод.Затем вызовите этот пакетный файл из C #
  • Может быть, вы можете использовать FileStream .. двоичное чтение-запись
  • Может быть, вы можете импортировать ссылку vb в ваш проект и использовать (несмысл)
  • Или напрямую убить процесс, который соответствует этой ошибке.

А вот еще один поиск, пожалуйста, посмотрите и этот вопрос тоже.

Это последний и хардкорный длинный выстрел .

С наилучшими пожеланиями ...

0 голосов
/ 21 января 2012

Devenv - агрессивный файловый шкафчик. Если вы сможете создавать свои проекты, создав файл MSBuild и обходя devenv, вам будет лучше. Некоторые типы проектов могут быть собраны только с помощью devenv, вы не указали, какие типы проектов вы используете, так что это может быть не вариант.

MSBuild имеет функцию, называемую «повторное использование узла», благодаря которой он создает процессы, которые могут зависать до 15 минут в качестве оптимизации для последующих сборок. Может случиться так, что повторное использование узла в сочетании с поведением блокировки файлов devenv создает проблемы.

Вы не совсем ясно дали понять, как именно вы выполняете сборку, но если задействован MSBuild, вы можете попытаться указать параметр / nodereuse: false, чтобы отключить эту функцию.

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

...