gpt4 book ai didi

c# - 以编程方式构建 msbuild 15 项目

转载 作者:可可西里 更新时间:2023-11-01 08:09:01 24 4
gpt4 key购买 nike

我正在尝试构建一个使用 VS2017 创建的简单 C# 7 类库项目。

框架程序集中的 MSBuild 已过时,因此我引用了 Microsoft.BuildMicrosoft.Build.EngineMicrosoft.Build.Framework 来自 visual studio 中的 MSBuild 文件夹(C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin)。

不过,当我这样做时:

using (var collection = new ProjectCollection())
{
var proj = collection.LoadProject(@"c:\projects\Sample\Sample.csproj"); // <-- exception
proj.Build(new[] {new ConsoleLogger()});
}

我收到 InvalidProjectFileException:无法识别工具版本“15.0”。可用的工具版本为“4.0”、“2.0”。

是否有使用最新构建工具和 C# 7 编译器调用构建的编程方式?

最佳答案

我的团队也有类似的需求,因此我为 C# 编写了一个支持多个版本的 Visual Studio 的生成器库。无法使Project.Build函数正常运行,于是直接执行MsBuild.exe。

我是如何构建它的:

使用 NuGet 中的 Microsoft.Build.Framework

创建一个包含 1 个名为 Build 的目标的新项目对象

定义正确的 ToolsVersion

根据Visual Studio版本的项目:

  • 2010, 2012 => 4.0
  • 2013 => 12.0
  • 2015 => 14.0
  • 2017 => 15.0

添加 MsBuild 类型的新任务

Projects 属性包含我需要构建的所有项目

定义工具版本

与项目具有相同值的 MsBuild 任务

将项目序列化为临时文件

根据ToolsVersion找到合适的MsBuild.exe

4.0, 12.0, 14.0

在注册表中找到:

Registry.LocalMachine.OpenSubKey($@"SOFTWARE\Microsoft\MSBuild\ToolsVersions\{msBuildVersion}")

15.0

注册表里没有了,需要用Nuget包Microsoft.VisualStudio.Setup.Configuration.Interop

        var query = new SetupConfiguration();

var query2 = (ISetupConfiguration2)query;

var e = query2.EnumAllInstances();

var helper = (ISetupHelper)query;

int fetched;

var instances = new ISetupInstance[1];

do
{
e.Next(1, instances, out fetched);
if (fetched > 0)
{
var instance = instances[0];

var instance2 = (ISetupInstance2)instance;

var state = instance2.GetState();

// Skip non-complete instance, I guess?
// Skip non-local instance, I guess?
// Skip unregistered products?
if (state != InstanceState.Complete
|| (state & InstanceState.Local) != InstanceState.Local
|| (state & InstanceState.Registered) != InstanceState.Registered)
{
continue;
}

var msBuildComponent =
instance2.GetPackages()
.FirstOrDefault(
p =>
p.GetId()
.Equals("Microsoft.Component.MSBuild",
StringComparison.InvariantCultureIgnoreCase));

if (msBuildComponent == null)
{
continue;
}

var instanceRootDirectory = instance2.GetInstallationPath();

var msbuildPathInInstance = Path.Combine(instanceRootDirectory, "MSBuild", msBuildVersion, "Bin", "msbuild.exe");

if (File.Exists(msbuildPathInInstance))
{
return msbuildPathInInstance;
}
}
} while (fetched > 0);

执行MsBuild.exe

并使用自定义 XML 记录器构建序列化项目 - 您可以使用 MsBuildExtensionPack 提供的记录器

阅读结果摘要

从Xml中反序列化结果摘要,并用它来确定构建是否失败,发生了哪些错误和警告等。

关于c# - 以编程方式构建 msbuild 15 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43078438/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com