繁体   English   中英

使用BuildManager生成项目会导致nuget包DLL被锁定

[英]Using BuildManager to build project causes a nuget package DLL to get locked

我正在执行以下代码:

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

由于此文件最终在我的应用程序中被“使用”,因此,在应用程序关闭之前,我的应用程序无法删除temp目录。
Chicken and Egg –我不想在文件夹消失之前关闭应用程序,并且在应用程序关闭之前不能删除文件夹。

任何人都有已知有效的解决方案吗?
例如:
我知道,一旦将DLL加载到应用程序中,它便是永久的,并且传统上无法发布。
但是-过去我听说您可以在应用程序中创建其他AppDomain,然后将程序集加载到AppDomains中而不是主应用程序中,然后可以处理AppDomain和关联的引用/程序集,我希望...可以处理?

注意-我知道我在上面调用Nuget软件包还原,但是逐步执行代码,我可以肯定地说锁定发生在构建步骤,而不是nuget还原。

我曾经遇到过类似的问题,但是没有使用BuildManager,而是使用了构建文件,并且在运行msbuild进程时,我注意到了类似的错误。

当我在任务管理器中查看时,我注意到有几个msbuild进程将某些文件锁定。

这是因为msbuild有一个称为nodereuse东西,它将使某些进程保持活动状态,以便进一步构建会更快。

如果要禁用此功能,可以使用以下msbuild参数:

/ nodeReuse:value/ nr:value
启用或禁用MSBuild节点的重用。
您可以指定以下值:

  • 真正。 节点在构建完成后保留,以便后续的构建可以使用它们(默认)。
  • 假。 构建完成后,节点不会保留。

节点对应于正在执行的项目。 如果包含/ maxcpucount开关,则多个节点可以同时执行。

在将此参数设置为false所有锁定的文件问题都消失了。 也许这也会对您有帮助。

您可能需要在处置它之前调用BuildManager.DefaultBuildManager.EndBuild() ,因为这将表明“预期(或允许)不再有任何构建请求,并且BuildManager可能会清理”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM