Ответ 1
(Правка: Сайед Ибрагим Хашими, который буквально написал книгу о msbuild, предлагает класс AppDomainIsolatedTask для лучшего подхода)
Мне удалось решить это самому...
Нашел этот пост на форуме от Дэна Мозли, одного из разработчиков MSBuild от Microsoft:
Всем привет,
К сожалению, это связано с тем, что MSBuild загружает сборки задач в основном домене приложения. CLR не позволяет выгрузить сборки из домена приложения, поскольку это позволяет проводить важные оптимизации с их стороны.
Единственный обходной путь, который я предлагаю, это вызвать tomsbuild.exe для сборки проектов, использующих задачу. Для этого создайте MSBuild.exe <> в качестве внешнего инструмента в VS.
Дэн
разработчик на msbuild
ДэнМозли - MSFT
Таким образом, кажется, что для снятия блокировок вы должны создать новый процесс MSBuild.exe. Это не может быть тот, который работает в Visual Studio, потому что когда MSBuild работает, он загружает задачи в основной домен приложения Visual Studio, и это никогда не может быть выгружено.
-
создайте новый проект MSBuild (.csproj или аналогичный), который переопределяет цель 'Build' и выполняет ваши пользовательские действия, например;
<!-- fragment of Prebuild.csproj --> <Target Name="Build"> <BuildOrmLayerTask Repository="$(Repository)" /> </Target>
-
Добавьте его в Visual Studio, если хотите, но используйте Configuration Manager, чтобы убедиться, что он не встроен ни в одну конфигурацию. Просто позвольте VS позаботиться об управлении версиями и тому подобном, а не о сборке.
-
Отредактируйте файл .csproj проекта, который зависит от
Prebuild.csproj
. Добавьте цельBeforeBuild
которая вызывает MSBuild с помощью задачиExec
. Это запустит новый процесс, и когда этот процесс завершится, блокировки файлов будут сняты. Пример;<PropertyGroup> <PrebuildProject>$(SolutionDir)Prebuild\Prebuild.csproj</PrebuildProject> </PropertyGroup> <Target Name="BeforeBuild"> <Exec Command="msbuild.exe "$(PrebuildProject)"" /> </Target>
Теперь, когда вы строите зависимый проект, он запускает MSBuild в новом процессе перед запуском компиляции.