我正在开发一个运行在.NET 4.8和C# 11上的旧网站,但仍然使用ASP.NET技术。我在整个代码库中引入了一些record
类,但当我在ASPX页面中引用这些类时,它在运行时崩溃,并显示错误:
CS1545: Property, indexer, or event 'AppCode.CoreUser.Email' is not supported by the language
详细的编译器输出显示,运行IIS的计算机正在运行csc.exe
版本的即时编译,该版本仅支持C# 5:
C:\Windows\SysWOW64\inetsrv> "C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe" /t:library {...}
Microsoft (R) Visual C# Compiler version 4.8.3761.0
for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.
我想问题是记录使用了C#5不支持的特性,但是我在谷歌上搜索过,还没有找到如何使用C#编译器的更高版本来构建ASPX页面。
有什么想法吗?
1条答案
按热度按时间gc0ot86w1#
我假设您已经在使用Roslyn CodeDOM提供程序,如果没有,您应该遵循Enabling the .NET Compiler Platform (“Roslyn”) in ASP.NET applications指南。
安装之后,
Web.config
中应该有一个system.codedom
元素,如下所示:请注意,
compilerOptions
属性包含带有/langversion:7.3
的编译器开关,这是.NET Framework官方支持的最新语言版本。没有什么可以阻止您将其升级到新版本,例如
/langversion:11
,但问题是Roslyn CodeDOM提供程序附带了一个旧版本的编译器(v3.6.0),它只支持C# 8。有a newer version of the package in the works,但时间轴不清楚,它可能不会支持最新版本的语言无论如何(因为它没有正式支持微软)。
幸运的是,Roslyn CodeDOM提供程序有一个MSBuild属性,您可以设置该属性来指定自定义编译器位置。结合
Microsoft.Net.Compilers.Toolset
NuGet包和GeneratePathProperty
,我们可以使用该属性下载较新版本的编译器,并让Roslyn CodeDOM提供程序使用该版本。首先,在
csproj
中添加对最新Microsoft.Net.Compilers.Toolset
包的引用:通过指定
IncludeAssets="none"
和PrivateAssets="all"
,我们确保了包中没有任何东西被消耗或传递,这纯粹是为了下载包中的编译器。通过指定
GeneratePathProperty="true"
,它允许我们引用包的位置,以便稍后设置RoslynToolPath
:完成这些操作后,您应该能够返回到您的
Web.config
并将语言版本转换为C# 11:/langversion:11
并重新编译所有内容。当你开始使用新版本的语言特性时,你可能会收到关于缺少类型等的编译器错误。在这种情况下,我建议你安装PolySharp包,它会为你处理大部分缺少的类型(通过使用源代码生成器)。