【问题标题】:How can I use an SLN file with MSBuild programmatically from C#?如何从 C# 以编程方式将 SLN 文件与 MSBuild 一起使用?
【发布时间】:2017-10-17 03:18:34
【问题描述】:

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

【问题讨论】:

  • 你的意思是Microsoft.Build.BuildEngine API 支持.sln 文件吗?如果没有,您可以使用 API Microsoft.Build.BuildEngine 以编程方式构建 sln 文件:stackoverflow.com/questions/6511380/…。此外,Microsoft.Build 程序集的 .NET 4.0 版本在 Microsoft.Build.Construction 命名空间中包含一个解析 Visual Studio 解决方案文件的 SolutionParser 类。 stackoverflow.com/questions/707107/….

标签: c# visual-studio msbuild microsoft.build


【解决方案1】:

经过更多搜索,我想通了。由于 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);

【讨论】:

  • 感谢您在这里分享您的解决方案,您可以将其标记为答案,这样可以帮助遇到相同问题的其他社区成员。
  • @Leo-MSFT 实际上,我现在看到了一些非常奇怪的行为,而我之前也看到了其中的一部分,这就是为什么我确认了您的解决方案然后又取消确认了一次。如果我在调试器中运行并将此路径添加为属性,它可以工作,但是当不在调试器中时它将无法找到正确的目标文件。如果我删除路径属性,则相反。当它在调试器之外添加路径失败时,它会在指定目录中查找 v14。 Microsoft.Build 包还没有 v15。也许这是其中的一部分
  • 这对我不起作用。这成功了:stackoverflow.com/a/14349500/3286975(注意:不推荐使用 BuildEngine API)。
猜你喜欢
  • 1970-01-01
  • 2014-04-09
  • 2010-09-07
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多