Использование 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 может очиститься"

Другие вопросы по тегам