Условное копирование зависимостей MSBuild

Наше решение настроено так, что проект A ссылается на проект B, проект B ссылается на проект C, а проект C имеет оболочку .NET, которая ссылается на собственные библиотеки DLL.

A -> B -> C -> Собственные библиотеки DLL через .NET Wrapper

Причина свертки в том, что мы имеем дело со сторонним оборудованием, иначе мы бы ссылались на библиотеки DLL прямо из проекта B. В любом случае -

Мы пытаемся получить некоторые файлы (собственные библиотеки DLL), на которые есть ссылки в проекте C, скопированные в проект A. Локальное копирование с действием сборки содержимого не работает, поскольку MSBuild не сообщает, что не может перезаписать файлы как только запускаются запускаются, процессы не убирают за собой и остаются запущенными.

  1. Возможно ли, чтобы MSBuild пытался убить процессы перед сборкой?

    OR

  2. Можно ли условно скопировать собственные библиотеки DLL из проекта B в проект A, если они не существуют в MSBuild? Папка bin проекта A — это место, откуда они запускаются, и именно здесь происходит сбой сборки (не из проекта C в B).


person Clark    schedule 12.08.2015    source источник


Ответы (1)


Похоже, ваша главная проблема в том, что ваше приложение не очищает себя после себя. Если ваше приложение запускает процессы, оно должно останавливать их при закрытии. Вы должны вызывать Process.Kill() для любых процессов, которые вы запустили до закрытия вашего приложения.

При этом возможны как 1), так и 2):

1) Вы можете вызвать любой исполняемый файл из msbuild с помощью задачи Exec. Вы можете использовать эту задачу для вызова команды «taskkill».

 <Target Name="BeforeBuild">
    <Exec Command="taskkill /IM ProcessToKill.exe /F"/>
</Target>

2) В задаче копирования msbuild есть параметр SkipUnchangedFiles, который копировать файлы, если они новее существующих файлов:

<Target Name="AfterBuild">
    <Copy
        SourceFiles="@(DllLocation)"
        DestinationFolder="@(DllLocation->'$(OutputDir)%(RecursiveDir)%(Filename)%(Extension)')"
        SkipUnchangedFiles="true"
    />
</Target>
person Dave C    schedule 12.08.2015
comment
Я смог заставить процесс очиститься после себя, используя: Exec Command="taskkill /fi &quot;IMAGENAME eq ProcessToKill.exe&quot; /F" как если бы процесс не был запущен, была бы выдана ошибка с переключателем /IM. Кроме того, добавление ссылки из проекта A в проект C было необходимо, чтобы предотвратить удаление DLL. Спасибо за помощь! - person Clark; 13.08.2015