为什么 Microsoft.Build.Framework.dll 15.3 不加载 csproj,而 15.1 可以?

Why does Microsoft.Build.Framework.dll 15.3 not load csproj, 15.1 does?

我在这个问题上花了几个小时,并进行了大量搜索以弄清楚发生了什么。

我有一个从 .csproj 文件加载项目文件的应用程序,因此它引用 Microsoft.Build dll。在我的一台电脑上一切正常。另一方面,当我尝试加载 .csproj 文件时应用程序崩溃。

我得到的异常是 Microsoft.Build.Exceptions.InvalidProjectFileException 类型的,带有以下消息:

The tools version "15.0" is unrecognized. Available tools versions are "14.0", "2.0", "3.5", "4.0".

起初我不确定是什么导致了这个问题,所以我想我应该将 .dll 包含在我的项目中。也就是说,我将 .dll 复制到项目中的一个文件夹中,并引用了这些 .dll。但是当我 运行 我的项目时,GAC 加载首选项让我很不舒服,因为输出 window 显示正在加载一个不同的 .dll:

Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Microsoft.Build.Framework\v4.0_15.1.0.0__b03f5f7f11d50a3a\Microsoft.Build.Framework.dll'.

所以我通过导航到该位置并查看 .dll 上的属性来查看每台计算机上加载的 .dll。

在运行的机器上,.dll 的版本为 15.1.1015。 在不起作用的机器上,.dll 的版本为 15.3.409

我没有发现有人在谈论这个确切的问题,但我看到有人在谈论升级到 Visual Studio 15.3 后遇到的问题。果然,不工作的电脑有Visual Studio15.3.5,而工作的电脑有Visual Studio15.2.

为了尝试解决这个问题,我使用此处概述的步骤从 GAC 中删除了 15.3:

唉,即使在这个更改之后,我仍然遇到同样的问题,所以将 GAC 更改为指向更早的 Microsoft.Build.Framework.dll 仍然没有修复它(可能是因为其他文件在Microsoft.Build 家族正在 15.3 加入 GAC?)。我确实验证了 GAC 加载的版本现在是 15.1。

我可以应用其他解决方法或修复程序来解决此问题吗?

我希望其他人可以用比这更好的答案来回答,但我能够通过在加载项目时强制使用版本 14.0 来解决这个问题。我的项目不需要 Visual Studio 2017 (MSBuild 15.X)。因为它也可以在 Visual Studio 2015 中加载,所以我只是在项目构造函数中指定版本号:

coreVisualStudioProject = new Project(fileName, null, "14.0", new ProjectCollection());