2017-10-17 155 views
0

我想在C#中使用更新的Microsoft.Build.Evaluation API创建自定义MSBuild脚本。我遇到的问题是这个较新的API不支持.sln文件。较旧的已弃用Microsoft.Build.Engine API确实支持.sln文件,但我想使用较新的文件,因为1)不推荐使用,2)似乎有更多联机文档和用法供参考。我已经看到,当成功编译解决方案时,MSBuild可以创建一个.metaproj文件,当此作业在CMD中进行时:set MSBuildEmitSolution=1。我需要.metaproj文件才能够首先编译解决方案。 API中是否有将.sln转换为.metaproj的内容?有解析.sln文件的库吗?如何以编程方式从C#使用带有MSBuild的SLN文件?

+0

你的意思是'Microsoft.Build.BuildEngine' API不支持的.sln文件?如果没有,您可以使用API​​'Microsoft.Build.BuildEngine'以编程方式构建sln文件:https://stackoverflow.com/questions/6511380/how-do-i-build-a-solution-programmatically-in-c。此外,Microsoft.Build程序集的.NET 4.0版本在解析Visual Studio解决方案文件的Microsoft.Build.Construction名称空间中包含一个SolutionParser类。 https://stackoverflow.com/questions/707107/parsing-visual-studio-solution-files。 –

回答

0

我在更多的搜索后找到了它。在网上找到好的示例有点困难,因为MSBuild API的两个不同版本,以及从命令行运行MSBuild的普及程度。

这是现在的工作对我来说,使用较新的MSBuild API代码:

var pc = new ProjectCollection(); 

var parameters = new BuildParameters(pc) 
{ 
    Loggers = new[] { _logger } //Instance of ILogger instantiated earlier 
}; 

var request = new BuildRequestData(
    projectFullPath: pathToMySlnFile, //Solution file path 
    globalProperties: myPropertyDictionary, 
    toolsVersion: null, 
    targetsToBuild: myTargetsArray, 
    hostServices: null, 
    flags: BuildRequestDataFlags.ProvideProjectStateAfterBuild); 

var buildResult = BuildManager.DefaultBuildManager.Build(parameters, request); 
+0

感谢您在这里分享您的解决方案,您可以将其标记为答案,这样可以帮助其他社区成员获得相同的问题。 –

+0

@ Leo-MSFT其实,我现在看到了一些非常奇怪的行为,而且我之前看到了这部分内容,这就是为什么我确认了您的解决方案,然后未确认一次。如果我在调试器中运行此路径作为属性添加,它将起作用,但是如果不在调试器中,它将无法找到正确的目标文件。如果我删除路径属性,则相反。当它在调试器外部添加的路径失败时,它将在v14的指定目录中查找。 Microsoft.Build软件包还没有v15。也许这是它的一部分 – JamesFaix

相关问题