VS2017 MSBuild 自动检测对于 WPF 项目采用 MSBuildv14 而不是 v15

swift

1个回答

写回答

Rainbow111

2025-09-09 10:35

+ 关注

AI
AI

一篇关于根据 VS2017 MSBuild 自动检测对于 WPF 项目采用 MSBuild/v14 而不是 v15 的文章。

在开发WPF项目时,我们经常使用Visual Studio 2017(VS2017)作为开发工具。然而,近期发现在某些情况下,VS2017会默认采用MSBuild/v15版本来编译WPF项目,而不是我们期望的MSBuild/v14版本。为了解决这个问题,我们需要自动检测并设置合适的MSBuild版本。本文将介绍如何通过使用自动化脚本来实现这一目标,并提供相应的案例代码作为参考。

自动检测MSBuild版本

在开始之前,我们需要了解如何自动检测当前系统中的MSBuild版本。我们可以通过查找注册表中的相关信息来实现这一目的。以下是一个示例代码,演示了如何获取当前系统中安装的MSBuild版本号:

csharp

using Microsoft.Win32;

public static class MSBuildVersionDetector

{

public static string GetInstalledMSBuildVersion()

{

const string registryKey = @"SOFTWARE\Microsoft\MSBuild\ToolsVersions";

using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registryKey))

{

if (key != null)

{

foreach (string subKeyName in key.GetSubKeyNames().OrderByDescending(x => x))

{

if (subKeyName.StartsWith("14.") || subKeyName.StartsWith("15."))

{

return subKeyName;

}

}

}

}

return null;

}

}

以上代码中,我们首先打开注册表中的SOFTWARE\Microsoft\MSBuild\ToolsVersions路径。然后,通过遍历子键的方式找到最新的MSBuild版本号。在这个例子中,我们只考虑了14.x和15.x版本,因为这两个版本是我们关心的。你可以根据自己的需求进行修改。

自动切换MSBuild版本

一旦我们获得了当前系统中安装的MSBuild版本号,我们就可以根据需要自动切换到合适的版本。以下是一个示例代码,演示了如何根据获取到的版本号来切换MSBuild版本:

csharp

using System;

using System.Diagnostics;

using System.IO;

public static class MSBuildVersionSwitcher

{

public static void SwitchToMSBuildVersion(string version)

{

string msbuildPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "MSBuild", version, "Bin", "MSBuild.exe");

if (!File.Exists(msbuildPath))

{

throw new FileNotFoundException($"MSBuild {version} not found at {msbuildPath}");

}

ProcessStartInfo startInfo = new ProcessStartInfo

{

FileName = msbuildPath,

Arguments = "/version",

RedirectStandardOutput = true,

UseShellExecute = false,

CreateNoWindow = true

};

using (Process process = new Process())

{

process.StartInfo = startInfo;

process.OutputDataReceived += (sender, e) => Console.WriteLine(e.Data);

process.Start();

process.BeginOutputReadLine();

process.WAItForExit();

}

}

}

以上代码中,我们首先构建了MSBuild的路径,并确保路径下存在对应版本的MSBuild可执行文件。然后,我们使用Process类来启动MSBuild,并使用/version参数输出当前的MSBuild版本号。你可以根据自己的需求修改代码来执行其他操作。

自动化脚本示例

下面是一个示例脚本,演示了如何自动检测并切换到合适的MSBuild版本:

csharp

string msbuildVersion = MSBuildVersionDetector.GetInstalledMSBuildVersion();

if (msbuildVersion != null)

{

Console.WriteLine($"Detected MSBuild version: {msbuildVersion}");

MSBuildVersionSwitcher.SwitchToMSBuildVersion(msbuildVersion);

}

else

{

Console.WriteLine("No compatible MSBuild version found.");

}

在这个示例中,我们首先使用MSBuildVersionDetector.GetInstalledMSBuildVersion()方法来获取已安装的MSBuild版本号。然后,如果版本号不为空,我们就调用MSBuildVersionSwitcher.SwitchToMSBuildVersion()方法来切换到该版本。如果没有找到合适的版本号,则输出相应的提示信息。

通过使用自动化脚本,我们可以方便地检测并切换合适的MSBuild版本,以确保我们的WPF项目可以在预期的环境中编译和运行。本文提供了获取已安装的MSBuild版本号和切换MSBuild版本的示例代码,希望能对你在开发WPF项目时解决相关问题有所帮助。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号