Construire un projet avec Microsoft.Build API

J’essaie de construire un projet en utilisant les classes de Microsoft.Build.

Le code est:

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

Cependant, il lance l’exception suivante:

 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 

J’ai essayé d’append les éléments suivants aux packages (à la fois dans un projet net452 et un projet net7):

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

Toujours obtenir le même résultat.

J’ai aussi essayé d’utiliser BuildManager comme ceci:

 var buildManager = new BuildManager(); buildManager.Build(new BuildParameters(), new BuildRequestData(new ProjectInstance(CS_PROJ_FILE), new[] {"Build"})); 

J’ai frappé la même erreur après avoir installé:

 Install-Package Microsoft.Build -Version 15.1.1012 

Mais ensuite j’ai installé:

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

Et les choses ont commencé à fonctionner.

Un peu déroutant …

“DasMulli” m’a indiqué cette question de stackoverflow à l’adresse:

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

Il existe apparemment un nouveau moyen de résoudre ce problème, comme décrit ici et ici .

Voici ce qui a fonctionné pour moi:

  1. J’ai supprimé Microsoft.Build.dll , Microsoft.Build.Framework.dll , Microsoft.Build.Tasks.Core.dll et Microsoft.Build.Utilities.Core.dll (c’est-à-dire tous les fichiers Microsoft.Build .dll) de la sortie de mon projet. dossier.

  2. J’ai supprimé plusieurs packages Microsoft.Build NuGet des références de mon projet.

  3. J’ai installé le package Microsoft.Build.Locator NuGet pour mon projet.

  4. J’ai ajouté le code suivant à mon programme:

      // 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(); 

Cela corrigeait l’exception répertoriée par l’OP et évitait les tonnes de messages d’erreur du compilateur sur l’impossibilité de résoudre toutes les références.

Edit: Plus d’informations ici: https://gist.github.com/DustinCampbell/32cd69d04ea1c08a16ae5c4cd21dd3a3