c# 和 .net core 的关系

来源:这里教程网 时间:2026-02-21 17:40:19 作者:

C# 是语言,.NET Core(现为统一 .NET 平台)是它运行的“操作系统级”环境。你写

C#
代码,但真正管内存、调 JIT、加载类库、处理跨平台 ABI 的,是
.NET
的运行时——不是 C# 自己干的。

为什么不能只装 C# 编译器就跑程序?

C# 源码编译后生成的是中间语言

IL
(不是机器码),必须靠
CLR
(Common Language Runtime)在运行时把它转成当前 CPU 能执行的指令。这个
CLR
.NET
的一部分,不是 C# 自带的。

csc.exe
(C# 编译器)只负责把
.cs
变成
.dll
.exe
(含 IL),它不提供
Console.WriteLine
的实现,也不管线程调度或 GC
你调用的
System.Collections.Generic.List<t></t>
HttpClient
、甚至
Span<t></t>
,全来自
.NET
提供的
BCL
(Base Class Library)
换言之:没有
.NET
C#
代码连
Console
都找不到——它只是语法正确,但根本无法链接和运行

.NET Core 不是“另一个 .NET”,而是 C# 跨平台的唯一现代载体

老式

.NET Framework
锁死 Windows,连
Directory.GetFiles
在 Linux 上都会抛
PlatformNotSupportedException
。而
.NET Core
(从
.NET 5
开始已统一为
.NET
)重写了整个底层,包括:

跨平台的
System.IO
实现(比如用
epoll
做 Linux 文件监听,而不是 Windows 的
ReadDirectoryChangesW
独立于 Windows 注册表的配置系统(
IConfiguration
默认走 JSON + 环境变量)
自包含部署模式:
dotnet publish -r linux-x64 --self-contained true
打出的包自带运行时,不依赖目标机装 .NET

这意味着:你用

C#
写的 Web API,只要没硬写
RegistryKey
WMI
,就能直接
dotnet run
在 macOS 或 Ubuntu 上——不是“理论上可行”,是默认就支持。

常见踩坑:以为 C# 版本 = .NET 版本

C# 12
支持
primary constructors
alias any
,但它能不能用,取决于你项目面向的
.NET
版本:

<targetframework>net6.0</targetframework>
下,即使装了最新 VS,
C# 12
新语法也会报错:“Feature is not available in C# 10”
反过来,
.NET 8
默认启用
C# 12
,但如果你手动在
.csproj
里加
<langversion>11</langversion>
,新语法就失效
更隐蔽的坑:
async
方法返回
IAsyncEnumerable<t></t>
.NET Core 3.0+
才有完整支持;在
netcoreapp2.2
下编译通过,运行时却抛
MissingMethodException

最常被忽略的一点:

C#
的语法糖(如
using
声明、
??=
)由编译器展开成基础 IL,但它的底层行为是否可靠,仍取决于
.NET
运行时有没有正确实现对应契约——比如
ValueTask<t></t>
的同步完成路径,在
.NET Core 2.1
.NET 5
之间就有细微差异,影响高并发下的对象复用逻辑。

相关推荐