使用 Microsoft.Build API 构建项目

问题描述 投票:0回答:4

我正在尝试使用 Microsoft.Build 中的类构建一个项目。

代码是:

var project = new ProjectInstance(CS_PROJ_FILE);
project.Build();

但是它抛出以下异常:

Microsoft.Build.Shared.InternalErrorException occurred
  HResult=0x80131500
  Message=MSB0001: Internal MSBuild Error: Type information for Microsoft.Build.Utilities.ToolLocationHelper was present in the whitelist cache as Microsoft.Build.Utilities.ToolLocationHelper, Microsoft.Build.Utilities.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a but the type could not be loaded. unexpectedly null
  Source=Microsoft.Build

我尝试将以下内容添加到包中(在 net452 和 net7 项目中):

  • id =“Microsoft.Build”版本=“15.1.1012”
  • id =“Microsoft.Build.Framework”版本=“15.1.1012”
  • id =“Microsoft.Build.Runtime”版本=“15.1.1012”
  • id =“Microsoft.Build.Tasks.Core”版本=“15.1.1012”
  • id =“Microsoft.Build.Utilities.Core”版本=“15.1.1012”

仍然得到相同的结果。

我也尝试过像这样使用

BuildManager

var buildManager = new BuildManager();
buildManager.Build(new BuildParameters(),
                   new BuildRequestData(new ProjectInstance(CS_PROJ_FILE), 
                                        new[] {"Build"}));
c# .net build msbuild
4个回答
22
投票

我安装后遇到同样的错误:

Install-Package Microsoft.Build -Version 15.1.1012

但后来我安装了:

Install-Package Microsoft.Build.Utilities.Core -Version 15.1.1012

一切开始发挥作用。

有点混乱...

“dasMulli”向我指出了这个 stackoverflow 问题:

https://github.com/Microsoft/msbuild/issues/1889


7
投票

显然有一种新方法可以解决此问题,如此处此处所述。

这对我有用:

  1. 我从项目的输出文件夹中删除了

    Microsoft.Build.dll
    Microsoft.Build.Framework.dll
    Microsoft.Build.Tasks.Core.dll
    Microsoft.Build.Utilities.Core.dll
    (即所有
    Microsoft.Build
    .dll 文件)。

  2. 我从项目引用中删除了几个

    Microsoft.Build
    NuGet 包。

  3. 我为我的项目安装了

    Microsoft.Build.Locator
    NuGet 包。

  4. 我将以下代码添加到我的程序中:

     // This needed after upgrading to Roslyn revision 34025, see these two links:
     //  https://github.com/dotnet/roslyn/issues/26029
     //  https://stackoverflow.com/a/49886334/253938
     MSBuildLocator.RegisterDefaults();
    

这修复了OP列出的异常并且避免了大量有关无法解析所有引用的编译器错误消息。

编辑:更多信息在这里:https://gist.github.com/DustinCampbell/32cd69d04ea1c08a16ae5c4cd21dd3a3


2
投票

Microsoft 提供了一个很好的链接这里

技巧确实是使用 nuget pacakges,并指定 ExcludeAssets=runtime 来告诉 NuGet 仅在构建时需要程序集,并且不应将其复制到输出目录。


0
投票
如上所述,Install-Package Microsoft.Build.Utilities.Core 对我有用。一分钟内完成。最短的修复。 VS2022 / MSBUILD 当前。

© www.soinside.com 2019 - 2024. All rights reserved.