BuildManager per utilizzare un’altra versione di MSBuild

Il codice seguente tenta di creare una soluzione a livello di codice, utilizzando BuildManager :

 ProjectCollection pc = new ProjectCollection(); pc.DefaultToolsVersion = "12.0"; pc.Loggers.Add(fileLogger); Dictionary globalProperty = new Dictionary(); BuildRequestData buildRequest = new BuildRequestData(solutionName, globalProperty, null, new[] { "Build" }, null); BuildParameters buildParameters = new BuildParameters(pc) { DefaultToolsVersion = "12.0", OnlyLogCriticalEvents = false, DetailedSummary = true, Loggers = new List { fileLogger }.AsEnumerable() }; var result = BuildManager.DefaultBuildManager.Build(buildParameters, buildRequest); 

Quando csc.exe questo codice (non crea nulla btw), posso vedere che viene utilizzato il seguente compilatore csc.exe , oltre a una particolare versione di winmdexp.exe :

 C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Csc.exe ExportWindowsMDFile: C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\winmdexp.exe 

Ma quando creo una soluzione utilizzando VS IDE, vengono visualizzate le seguenti informazioni:

 C:\Program Files (x86)\MSBuild\12.0\bin\Csc.exe ExportWindowsMDFile: C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\winmdexp.exe 

Perché questo sta accadendo nel mio codice e come posso cambiarlo?

    A partire da Visual Studio 2013, MSBuild non è più un componente di .NET Framework . Ciò ha comportato una ristrutturazione dell’imballaggio e dell’implementazione. Il vecchio framework MSBuild vive ancora nelle cartelle .NET Framework. Tuttavia, quando si installa Visual Studio 2013, i Microsoft Build Tools 12.0 vengono installati anche in C: \ Programmi (x86) \ MSBuild \ 12.0. Nota che gli strumenti di costruzione sono disponibili separatamente da Visual Studio qui .

    Ho incontrato la stessa situazione come te quando ho provato per la prima volta. Il problema è che probabilmente hai fatto riferimento ai vecchi assembly “4.0” MSBuild Framework. È necessario fare riferimento ai nuovi assembly 12.0 che si trovano in C: \ Programmi (x86) \ MSBuild \ 12.0 \ bin (sarà necessario navigare in VS per aggiungere i riferimenti). Probabilmente hai bisogno di Microsoft.Build, Microsoft.Build.Engine e Microsoft.Build.Framework. Una volta aggiornati i riferimenti, ho visto che stava usando gli stessi strumenti di VS 2013 durante la costruzione.