使用更新的C#功能更新用于ASP.NET ASPX页的C#编译器

5f0d552i  于 2023-03-09  发布在  .NET
关注(0)|答案(1)|浏览(138)

我正在开发一个运行在.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页面。
有什么想法吗?

gc0ot86w

gc0ot86w1#

我假设您已经在使用Roslyn CodeDOM提供程序,如果没有,您应该遵循Enabling the .NET Compiler Platform (“Roslyn”) in ASP.NET applications指南。
安装之后,Web.config中应该有一个system.codedom元素,如下所示:

<system.codedom>
  <compilers>
    <compiler extension=".cs" language="c#;cs;csharp" warningLevel="4" compilerOptions="/langversion:7.3 /nowarn:1659;1699;1701;612;618" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=3.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    <compiler extension=".vb" language="vb;vbs;visualbasic;vbscript" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008,40000,40008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=3.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </compilers>
</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包的引用:

<ItemGroup>
  <PackageReference Include="Microsoft.Net.Compilers.Toolset" Version="4.5.0" IncludeAssets="none" PrivateAssets="all" GeneratePathProperty="true" />
</ItemGroup>

通过指定IncludeAssets="none"PrivateAssets="all",我们确保了包中没有任何东西被消耗或传递,这纯粹是为了下载包中的编译器。
通过指定GeneratePathProperty="true",它允许我们引用包的位置,以便稍后设置RoslynToolPath

<PropertyGroup>
  <LangVersion>11</LangVersion>
  <RoslynToolPath>$(PkgMicrosoft_Net_Compilers_Toolset)\tasks\net472</RoslynToolPath>
</PropertyGroup>

完成这些操作后,您应该能够返回到您的Web.config并将语言版本转换为C# 11:/langversion:11并重新编译所有内容。
当你开始使用新版本的语言特性时,你可能会收到关于缺少类型等的编译器错误。在这种情况下,我建议你安装PolySharp包,它会为你处理大部分缺少的类型(通过使用源代码生成器)。

相关问题