2011-10-21 14 views
7

dopo che Microsoft ha contrassegnato BuildEngine.Engine e BuildEngine.Project come obsoleti ho provato a utilizzare la nuova proposta di Microsoft come si può vedere sotto. Ma non ho idea di dove posso integrare il file xmlproject. È qui qualcuno che conosce la soluzione di questo problema?Migrare Microsoft.Build.BuildEngine.Engine in Microsoft.Build.Evaluation.ProjectCollection

Il file di progetto XML contenuti

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
    <ProjectToBuild Include ="myproject.csproj" /> 
    </ItemGroup> 
    <Target Name="Build"> 
    <MSBuild Projects="@(ProjectToBuild)" 
     Properties="Configuration=Debug" StopOnFirstFailure="true" /> 
    </Target> 
</Project> 

Il vecchio e di lavoro di versione (ma obsoleta)

Microsoft.Build.BuildEngine.Engine engine = new Microsoft.Build.BuildEngine.Engine(); 
engine.DefaultToolsVersion = "4.0"; 
engine.RegisterLogger(new ConsoleLogger()); 
Microsoft.Build.BuildEngine.Project project = new Microsoft.Build.BuildEngine.Project(engine); 
project.Load(xmlprojectfile); 
if (!project.Build()) 
{ 
    Console.ReadLine(); 
} 

Il nuovo non funziona verison

Microsoft.Build.Evaluation.ProjectCollection collection = new Microsoft.Build.Evaluation.ProjectCollection(); 
collection.DefaultToolsVersion = "4.0"; 
collection.RegisterLogger(new ConsoleLogger()); 
Microsoft.Build.Evaluation.Project project = new Microsoft.Build.Evaluation.Project(collection); 
if (!project.Build()) 
{ 
    Console.ReadLine(); 
} 

risposta

3

È inoltre necessario creare un oggetto Microsoft.Build.Execution.BuildRequestData contenente il file di progetto XML e un dizionario di proprietà std come Configuration e Platform. Quindi si crea un oggetto Microsoft.Build.Execution.BuildParameters contenente l'oggetto ProjectCollection dallo snippet di codice e lo si passa al Microsoft.Build.Execution.BuildManager predefinito.

pseudo codice PowerShell:

#set build properties 
$props = new-object "System.Collections.Generic.Dictionary``2[[System.String],[System.String]]" 
$props.Add("Configuration",$config) 
$props.Add("Platform",$platform) 

#create the projectCollection 
$projectCollection = new-object Microsoft.Build.Evaluation.ProjectCollection -argumentList $props,$loggers,"ConfigurationFile,Registry" 
$request = new-object Microsoft.Build.Execution.BuildRequestData -argumentlist $project,$props,$null,$targets,$null 

#create a BuildParameters object to hold the Project Collection 
$parameters = new-object Microsoft.Build.Execution.BuildParameters -argumentlist @($projectCollection) 
$parameters.MaxNodeCount = 1 
$parameters.Loggers = $projectCollection.Loggers 
$parameters.ToolsetDefinitionLocations = "ConfigurationFile,Registry" 
$parameters.DefaultToolsVersion = $toolsVersion 

#get the build manager and submit a build request with the appropriate parameters 
$manager = [Microsoft.Build.Execution.BuildManager]::DefaultBuildManager 
$result = $manager.Build($parameters, $request) 
2

Ti manca project.Load (xmlprojectfile); linea nel tuo codice migrato. Devi aggiungere xmlprojectfile in projectcollection in qualche modo, immagino.

1

Invece di creare un progetto nuova con nuova parola chiave:

// var project = new Project(collection); 

Utilizzare questa:

var project = collection.LoadProject("myproject.csproj")