Как исправить ошибку MSB3073 в моем событии после сборки?

Я работаю над проектом, который требует, чтобы DLL генерировались путем создания моего решения для копирования из папки bin в другую папку, оба из которых находятся на моей машине, на моем диске C. Я написал пакетный файл, который использует xcopy для выполнения этого, который вы можете увидеть здесь:

xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.dll" "C:\inetpub\wwwroot\AppServer\bin\"
xcopy /s /y /q "C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.pdb" "C:\inetpub\wwwroot\AppServer\bin\"

Теперь я пробовал многочисленные итерации этого файла, который находится по адресу:

C:\Users\scogan\Desktop\CopyFiles.bat

поэтому моя командная строка события post-build выглядит следующим образом:

call C:\Users\scogan\Desktop\CopyFiles.bat

Я запускаю этот пакетный файл самостоятельно с двумя текстовыми файлами в папках на моем рабочем столе, и он отлично работает. Я также запускаю его так же, как и файлы, которые мне нужно копировать самостоятельно, и это тоже отлично работает. Однако, когда я пытаюсь запустить это как событие после сборки, я получаю этот вывод:

1>  Organizr -> C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Client\bin\Debug\Organizr.exe
1>  File not found - Organizr.Services.dll
1>  0 File(s) copied
1>  0 File(s) copied
1>  File not found - Organizr.Services.pdb
1>c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "call C:\Users\scogan\Desktop\CopyFiles.bat" exited with code 4.

Я провел некоторое исследование и обнаружил, что код ошибки 4 означает, что произошла ошибка инициализации. Недостаточно памяти или места на диске, или вы ввели недопустимое имя диска или недопустимый синтаксис в командной строке. "

Я также посмотрел, что такое MSB3073, и на самом деле не нашел много того, что может мне помочь. Итак, мой вопрос в том, что я делаю неправильно? Абсолютные пути испортили его? Любая помощь здесь ценится.

Ответы

Ответ 1

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

Ответ 2

Предпочитаете задачу "Копировать" MsBuild в целевой среде AfterBuild в событии после сборки.

Добавьте эту цель в свой файл проекта и удалите PostBuildEvent.

<Target Name="AfterBuild">
    <Copy SourceFiles="C:\Users\scogan\Documents\Visual Studio 2012\Projects\Organizr\Server\bin\Debug\Organizr.Services.*" 
          DestinationFolder="C:\inetpub\wwwroot\AppServer\bin\" 
          OverwriteReadOnlyFiles="true" 
          SkipUnchangedFiles="false" />
</Target>

Ответ 3

Для чего это стоит, проблема в моем случае была вызвана использованием '/' в качестве разделителя каталогов в команде copy. Необходимо использовать обратную косую черту.

Ответ 4

В моем случае, DLL, которую я создавал, создавая проект, все еще используется в фоновом режиме. Я убил приложение, а затем xcopy работал нормально, как ожидалось.

Ответ 5

Это слишком поздно, но опубликую свой опыт для людей, которые смотрят на него позже: -

В MS VS 2010 у меня была такая же проблема. Это было решено путем помещения кавычек в аргументы команды копирования после сборки, которые содержали пробелы!

В Project Properties --> Configuration Properties --> Build Events --> Post-Build Event --> Command Line измените:

copy $(ProjectDir)a\b\c $(OutputPath)

в

copy "$(ProjectDir)a\b\c" "$(OutputPath)"

Ответ 6

Указанная ошибка связана с событием после сборки. Почему-то VS средство не может скопировать файлы в папку назначения. Причин может быть много. Чтобы выяснить точную причину ошибки, перейдите в Сервис> Опция> Проект и решение> Построить и запустить и измените "Детализация сборки проекта MsBuild" на "Диагностика". Это даст вам достаточно информации, чтобы обнаружить актуальную проблему.

Ответ 7

Если проблема по-прежнему сохраняется даже после установки после сборки в правильном проекте, попробуйте использовать "copy" вместо xcopy. Это сработало для меня.

Ответ 8

Событие после сборки (в разделе "События сборки" в диалоговом окне свойств) импортированного проекта имело переменную среды, которая не была определена.
Перейдите к Control Panel\All Control Panel Items\System\Advanced system settings, чтобы добавить соответствующую переменную среды , и сделайте не более, чем перезапуск VS2017, чтобы устранить ошибку.
Кроме того, следуя @Seans и другим ответам, касающимся нескольких рас/конфликтов проекта, создайте временную папку в выходной папке следующим образом:

like so

и выберите проект, выдающий предпочтительный результат:

enter image description here

и сборка (без перестройки/очистки) - это быстрое решение.

Ответ 9

Я решил это, выполнив следующее:

В Visual Studio я пошел в Project -> Project Dependencies

Я выбрал решение XXX.Test и сказал, что от решения XXX также зависит, чтобы события post-build в решении XXX.Test не генерировали эту ошибку (выйдите с code 4).

Ответ 10

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

  1. откройте решение от имени администратора и создайте решение.
  2. если у вас возникла проблема, например, "0 File (s) скопированы"), проверьте исходный и целевой путь. возможно, вы используете неправильный путь. было бы лучше, если бы вы запускали ту же команду в "командной строке", чтобы проверить, работает ли она нормально или нет.

Ответ 11

У меня была такая же проблема для моего тестового проекта. Я узнал, почему мое событие сборки сообщений не работает и что, поскольку я копировал файлы перед запуском команды $(ProjectName).exe, и некоторые из этих файлов были необходимы для самого проекта тестирования. Следовательно, просто перемещая $(ProjectName).exe, поскольку первая команда исправляет проблему.

Ответ 12

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

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

  • Ограничьте копируемые файлы, т.е. вместо xcopy $(TargetDir)*.*"... вместо этого сделайте xcopy "$(TargetDir)$(TargetName).*"...

  • Перехватите ошибку и повторите попытку, т.е.

    :loop
    xcopy /Y /R /S /J /Q  "$(TargetDir)$(TargetName).*" "somewhere"
    if ErrorLevel 1 goto loop
  • Используйте robocopy вместо xcopy

  • Вы, вероятно, не захотите этого делать, так как это увеличит время сборки, но вы можете уменьшить максимальное количество параллельных сборок проекта до 1...

enter image description here