.NET 兼容性

以 Markdown 格式查看

Fern 生成的 .NET SDK 支持现代 .NET 版本、.NET Framework 版本和 Unity。

由于这些 SDK 使用现代 C# 特性构建,即使在针对较旧的 .NET Framework 目标时,您也需要以下条件:

  • 现代编译器(Visual Studio 2022 或 .NET SDK)
  • 相应的 .NET Framework 开发者包或引用程序集

支持的框架

Fern .NET SDK 支持所有官方支持的 .NET 版本,除了 net35。

框架目标框架标识符 (TFM)
.NET 9net9.0
.NET 8net8.0
.NET Framework 4.8.1net481
.NET Framework 4.8net48
.NET Framework 4.7.2net472
.NET Framework 4.7.1net471
.NET Framework 4.7net47
.NET Framework 4.6.2net462

C# 语言版本由您的编译器决定,而目标框架决定可用的运行时和基类库 API。Fern SDK 使用现代 C# 特性,但编译为较旧的框架版本。

所有主要 IDE 在针对 net462net472net48 版本时都支持 Fern 生成的 SDK:

  • Visual Studio 2022(推荐)- 开箱即用。在项目中设置 <LangVersion> 并安装相应的开发者包
  • Visual Studio 2019 - 原生支持 C# 9。对于更新的 C# 版本,添加 Microsoft.Net.Compilers.Toolset 包。
  • Rider - 使用 Roslyn。设置 <LangVersion> 并确保引用程序集可用。
  • VS Code - 通过 OmniSharp 和 .NET SDK 构建工作。
  • Unity - 使用 Unity 自己的 C# 编译器。请参阅在 Unity 中使用 SDK

您可以通过 Microsoft.Net.Compilers.Toolset 包在任何环境中”自带编译器”。

使用 Visual Studio 2022+ 或 .NET SDK 附带的 Roslyn 编译器csc)。通过 <LangVersion> 设置您的 C# 版本为 latestpreview 或特定版本(最低 9)。

Fern 的 .NET SDK 不支持传统的 Mono 编译器(mcsgmcs)或 Roslyn 之前的 csc.exe 编译器。即使在 Mono 上构建也请使用 Roslyn。

在 Mono 上构建

使用 .NET SDK(dotnet)与 Microsoft.NETFramework.ReferenceAssemblies 包在非 Windows 系统上提供 net48 引用。通过 dotnet build 或 Mono 的 MSBuild 使用 Roslyn。

macOS/Linux
$dotnet build -c Release

在 Unity 中使用 SDK

Unity 控制自己的 C# 编译器和 .NET 配置文件,这会影响您如何使用 Fern 的 .NET SDK。

Unity 使用 Roslyn 编译项目,通常支持 C# 9(因 Unity 版本而异)。您无法通过更改包来强制 Unity 使用更新的 C# 编译器,因为 Unity 在编辑器内部控制编译器。

在 Unity 中配置:Edit → Project Settings → Player → Other Settings → Api Compatibility Level

  • .NET Standard 2.1(推荐用于跨平台插件)
  • .NET Framework 4.x(Unity 的”4.x 等效”配置文件)

Unity 不支持 NuGet 包,因此您必须手动下载这些程序集并将其添加到您的 Unity 项目:

程序集NuGet 包
Microsoft.Bcl.AsyncInterfaces10.0.0-preview.6.25358.103
OneOf3.0.271
OneOf.Extended3.0.271
System.Buffers4.6.1
System.IO.Pipelines10.0.0-preview.6.25358.103
System.Memory4.6.3
System.Runtime.CompilerServices.Unsafe6.1.2
System.Text.Encodings.Web10.0.0-preview.6.25358.103
System.Text.Json10.0.0-preview.6.25358.103
System.Threading.Tasks.Extensions4.6.3
portable.system.datetimeonly9.0.0

项目配置示例

尽可能使用 SDK 样式项目,因为它们提供现代编译器和更简单的多目标支持。如果您有经典项目格式,请考虑转换为 SDK 样式。传统项目部分涵盖了无法转换的传统设置。

在 macOS/Linux 上构建

在 macOS/Linux 上为 net48 构建时,您不会有 Windows 目标包。添加引用程序集包:

YourProject.csproj
1<ItemGroup>
2 <PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" PrivateAssets="all" />
3</ItemGroup>

这提供了 net48 引用程序集,以便 Roslyn 可以在任何平台上为 net48 编译。您仍然需要 Mono 或 Wine 来执行结果。

使用现代 C# 针对 net48

1

配置您的项目

前提条件(Windows)

安装 .NET Framework 4.8 开发者包,以便编译器可以使用 net48 引用程序集。

YourProject.csproj
1<Project Sdk="Microsoft.NET.Sdk">
2 <PropertyGroup>
3 <!-- 目标 .NET Framework 4.8 -->
4 <TargetFramework>net48</TargetFramework>
5
6 <!-- 使用现代 C# 版本 -->
7 <LangVersion>latest</LangVersion>
8
9 <!-- 可选,但推荐用于更好的警告 -->
10 <Nullable>enable</Nullable>
11 </PropertyGroup>
12</Project>
2

构建您的项目

$dotnet build -c Release
3

多目标(可选)

要支持多个框架,使用 <TargetFrameworks>

YourProject.csproj
1<TargetFrameworks>net48;net8.0</TargetFrameworks>

对于较旧的 MSBuild/Visual Studio 版本、Visual Studio 2019 或传统的 packages.config 设置,添加现代 Roslyn 工具集并针对旧框架。

1

安装目标包

安装相应的 .NET Framework 开发者包,以便 Visual Studio 可以找到引用程序集。

2

设置语言版本

YourProject.csproj
1<PropertyGroup>
2<!-- 解锁现代 C# -->
3<LangVersion>latest</LangVersion>
4</PropertyGroup>

或使用特定版本:9101112preview

3

添加现代编译器

YourProject.csproj
1 <ItemGroup>
2 <PackageReference Include="Microsoft.Net.Compilers.Toolset" Version="x.y.z">
3 <!-- 保持私有: -->
4 <PrivateAssets>all</PrivateAssets>
5 </PackageReference>
6 </ItemGroup>

这确保您的构建使用现代的 csc.exe,即使您的 IDE/MSBuild 较旧。

故障排除

在您的项目中添加一个小垫片或引用一个辅助包。

  • Windows:安装 .NET Framework 4.8 开发者包
  • 跨平台/CI:将 Microsoft.NETFramework.ReferenceAssemblies 添加到项目中(作为 PrivateAssets=all)。

Microsoft.Net.Compilers.Toolset 添加到项目中,或迁移到 VS 2022+。

这个错误发生在较旧的 Visual Studio 版本中使用 required 关键字时。请按照传统项目的说明添加现代编译器。

某些版本的 Visual Studio 可能在 IDE 中显示此错误,但在使用包提供的编译器时成功编译项目。