Использование BuildManager для сборки проекта приводит к блокировке DLL пакета nuget
Я выполняю следующий код:
public static BuildResult Compile(string projectFilePath)
{
Nuget.NugetRestore(projectFilePath);
ProjectCollection pc = new ProjectCollection();
Dictionary<string, string> globalProperty = new Dictionary<string, string>();
globalProperty.Add("nodeReuse","false");
BuildParameters bp = new BuildParameters(pc);
BuildRequestData buildRequest = new BuildRequestData(
projectFilePath, globalProperty, "4.0", new string[] { "Clean", "Build" }, null);
BuildResult buildResult = BuildManager.DefaultBuildManager.Build(bp, buildRequest);
BuildManager.DefaultBuildManager.Dispose();
return buildResult;
}
Однако, когда задача сборки завершена, когда я пытаюсь удалить папку - я не могу этого сделать, потому что мое приложение загрузило DLL в память из папки пакета решений.
В частности, Microsoft.Bcl.Build.Tasks.dll
Поскольку этот файл становится "используемым" в моем приложении, мое приложение не может удалить временный каталог, пока приложение не закроется.
Цыпленок и Яйцо - я не хочу закрывать приложение, пока папка не исчезнет, и я не могу удалить папку, пока приложение не закроется.
У кого-нибудь есть какие-нибудь решения, которые, как известно, работают?
Например:
Я знаю, что как только DLL загружена в приложение, она является постоянной и не может быть традиционно выпущена.
Однако в прошлом я слышал, что вы можете создавать дополнительные домены приложений внутри приложения, а затем загружать сборки в домены приложений вместо основного приложения, а затем вы можете распоряжаться доменом приложений и связанными ссылками / сборками, и я надеюсь... обрабатывает?
Примечание. Я знаю, что я вызываю восстановление пакета Nuget выше, но, шагая по коду, я могу однозначно сказать, что блокировка происходит на этапе сборки, а не восстановления nuget.
2 ответа
Однажды у меня была похожая проблема, но, не используя BuildManager, я использовал файл сборки и при запуске msbuild
Процесс я заметил похожую ошибку.
Когда я посмотрел в диспетчере задач, я заметил, что было несколько процессов msbuild, которые удерживали некоторые файлы заблокированными.
Это потому что msbuild
есть что-то под названием nodereuse
это будет поддерживать некоторые процессы активными, поэтому дальнейшие сборки будут выполняться быстрее.
Если вы хотите отключить это, вы можете использовать следующее msbuild
параметр:
/ nodeReuse: значение ИЛИ /nr: значение
Включите или отключите повторное использование узлов MSBuild.
Вы можете указать следующие значения:
- Правда. Узлы остаются после завершения сборки, так что последующие сборки могут использовать их (по умолчанию).
- Ложь. Узлы не остаются после завершения сборки.
Узел соответствует проекту, который выполняется. Если вы включите параметр / maxcpucount, несколько узлов могут работать одновременно.
После того, как я установил этот параметр на false
все мои проблемы с заблокированными файлами исчезли. Может быть, это вам тоже поможет.
Вы можете позвонить BuildManager.DefaultBuildManager.EndBuild()
перед его удалением, так как это будет сигнализировать, что "больше не ожидается (или разрешено) запросов на сборку и что BuildManager может очиститься"