![](/img/trans.png)
[英]Microsoft.Build.Evaluation.ProjectCollection LoadProject method throws Microsoft.Build.Exceptions.InvalidProjectFileException
[英]Migrate Microsoft.Build.BuildEngine.Engine to Microsoft.Build.Evaluation.ProjectCollection
在Microsoft將BuildEngine.Engine和BuildEngine.Project標記為過時之后,我嘗試使用Microsoft的新建議,如何在下面看到它。 但是我不知道在哪里可以集成xmlprojectfile。 這里有人知道這個問題的解決方案嗎?
XML項目文件內容
<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>
舊版本和工作版本(但已過時)
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();
}
新的不起作用的版本
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();
}
您還需要創建一個Microsoft.Build.Execution.BuildRequestData對象,其中包含XML項目文件和std屬性字典,例如Configuration和Platform。 然后,創建一個Microsoft.Build.Execution.BuildParameters對象,該對象包含來自代碼片段的ProjectCollection對象,並將其傳遞給默認的Microsoft.Build.Execution.BuildManager。
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)
您缺少project.Load(xmlprojectfile); 行在您的遷移代碼中。 我想您必須以某種方式將xmlprojectfile添加到projectcollection中。
而不是使用new關鍵字創建新項目:
// var project = new Project(collection);
用這個:
var project = collection.LoadProject("myproject.csproj")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.