Условно копируем зависимости MSBuild
Мы настроили наше решение таким образом, чтобы проект A ссылался на проект B, проект B ссылается на проект C, а проект C имеет оболочку.NET, которая ссылается на собственные библиотеки DLL.
A -> B -> C -> Собственные библиотеки DLL через.NET Wrapper
Причина свертки в том, что мы имеем дело с оборудованием сторонних производителей, или мы будем ссылаться на библиотеки DLL прямо из проекта B. В любом случае -
Мы пытаемся получить некоторые файлы (собственные библиотеки DLL), на которые есть ссылки в проекте C, скопированные в проект A. Копировать локально с действием сборки "Content" не работает, потому что MSBuild не сможет сказать, что он не может перезаписать файлы, как только они при их запуске процессы не убираются за собой и остаются запущенными.
Возможно ли, чтобы MSBuild пыталась уничтожить процессы перед сборкой?
ИЛИ ЖЕ
- Можно ли условно скопировать собственные библиотеки DLL из проекта B в проект A, если они не существуют с MSBuild? Папка bin проекта A находится там, откуда они запускаются, и именно здесь происходит сбой сборки (не из проекта C в B).
1 ответ
Похоже, ваша главная проблема в том, что ваше приложение не очищается после себя. Если ваше приложение запускает процессы, оно должно остановить их после закрытия. Вы должны вызывать Process.Kill() для любых процессов, которые вы запустили до закрытия вашего приложения.
Сказав это, оба 1) и 2) возможны:
1) Вы можете вызвать любой исполняемый файл из msbuild, используя задачу Exec. Вы можете использовать эту задачу для вызова команды taskkill.
<Target Name="BeforeBuild">
<Exec Command="taskkill /IM ProcessToKill.exe /F"/>
</Target>
2) Задача msbuild Copy имеет параметр "SkipUnchangedFiles", который будет копировать файлы только в том случае, если они новее существующих:
<Target Name="AfterBuild">
<Copy
SourceFiles="@(DllLocation)"
DestinationFolder="@(DllLocation->'$(OutputDir)%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="true"
/>
</Target>