旧 ASP.NET 4 应用程序的构建服务器无法构建新的 C# 7,但它在开发中工作
Posted
技术标签:
【中文标题】旧 ASP.NET 4 应用程序的构建服务器无法构建新的 C# 7,但它在开发中工作【英文标题】:Build server of an old ASP.NET 4 application fails building new C# 7, but it works in development 【发布时间】:2018-11-01 10:35:41 【问题描述】:我最近开始研究基于 .NET framework 4.0 的旧版 ASP.NET 代码库。我们设法将所有内容从 Visual Studio 2012 传递到 VS 2017,用新版本的 Jenkins 更新了构建服务器并安装了 .NET framework 4.7.x。
在本地我们可以编写最新版本(7.3)的 C# 代码并且构建工作(如果我没记错的话,VS 不使用 MSBuild),但是当我们在构建服务器上部署时构建失败,因为那里有 MSBuild 无法识别比 C# 4.0 更新的构造。为避免错误,我将 lang 版本修复为 4.0(项目的高级构建属性),所以如果我编写的 C# 太新,VS 在 dev 中阻止了我,但我们想开始使用新的 C#。
我们还尝试直接在项目中修复 C# 7.3(csproj 内 PropertyGroup 中的<LangVersion>7.3</LangVersion>
),但项目元素 (csproj) 的 ToolsVersion
属性为 14.0,但随后构建我们的 MSBuild 失败并出现错误:
CS1617:/langversion 的选项“6”无效;必须是 ISO-1、ISO-2、3、 4、5 或默认值
这里解释了我想做的事情是可能的:https://www.dotnetcurry.com/dotnet/1427/build-apps-different-dotnet-framework-versions
无论我们在项目中针对哪个 .NET 框架版本, 使用的 C# 语言版本不会改变。这很好,因为 之后引入的绝大多数语言特性 语言版本不依赖于 CLR 或特定 API。 它们只是语法糖和由 编译器仍可在 .NET Framework 2.0 中运行。
有人知道我们犯了什么错误吗?
【问题讨论】:
***.com/a/32534628/11683? 据我所知,每个 C# 语言版本都没有重大变化(如果我错了请纠正我),所以用 C# 4.0 编写的代码在 C# 7.3 中的行为应该完全相同 @GSerg 我读过那个寻找错误的文章,但是我在随机实验中遇到了这个错误,我不确定这是否是我的情况。可能我应该更好地阅读所有答案。 @vasily.sib 我的问题是 MSBuild 显然无法理解 C# 4.0 以外的任何新内容,而我们想使用 C# 7.x 进行编码(例如,如果我编写nameof
,则构建失败)
@MauroPiccotti MSBuild 是 .net 的一部分,VS 也使用 MSBuild,唯一的例外是它使用自己的(托管)版本的 MSBuild,如 here 所述,您可以尝试更新您的.net 框架到最新可用并检查 MSBuild 是否能够理解 C# 7.3?
@vasily.sib 在我们安装 .net framework 4.7.x 的服务器上,如问题中所述。它不起作用,可能是我们在csproj或构建服务器上的配置错误。
【参考方案1】:
问题是在构建服务器上没有正确安装 MSBuild,并且构建脚本是旧的。 安装 Visual Studio 2017 构建工具并修复我们解决的脚本上的路径。
在我们遇到“找不到“GetReferenceNearestTargetFrameworkTask”任务的问题后,我们按照此处的说明解决了:The "GetReferenceNearestTargetFrameworkTask" task was not found (正确答案取决于您安装 VS Buld 工具时使用的策略)。
【讨论】:
以上是关于旧 ASP.NET 4 应用程序的构建服务器无法构建新的 C# 7,但它在开发中工作的主要内容,如果未能解决你的问题,请参考以下文章
如何在 asp.net core 2.1 中使用 net.tcp 服务