<p>Linux 运行 C# 程序需明确安装 dotnet-sdk(开发)或 dotnet-runtime(仅运行),不可混用;Ubuntu/Debian 应添加微软官方 APT 源安装,CentOS/RHEL 需注意系统版本兼容性、SELinux 和 GPG 密钥问题。</p>

Linux 上跑 C# 程序不需要装“.NET Core 环境”这个模糊概念——你得明确装的是 dotnet-sdk(开发用)还是 dotnet-runtime(仅运行已编译的 dll 或 self-contained 应用)。装错或混用会导致 dotnet --version 找不到、dotnet run 报错 The SDK 'Microsoft.NET.Sdk' specified could not be found,或者 dotnet myapp.dll 直接提示 Could not execute because the application was not found。
怎么选包:SDK 还是 Runtime?
看你要干啥:
- 要写代码、改
.cs、执行dotnet build或dotnet run→ 必须装dotnet-sdk - 只部署别人编译好的
.dll或发布成framework-dependent的程序 → 装对应版本的dotnet-runtime就够了 - 部署的是
self-contained应用(含所有依赖的单个文件夹)→ 完全不需要装任何 .NET 包,直接./myapp运行
Ubuntu/Debian 默认源里没有最新版,别用 apt install dotnet-sdk-8.0 试图碰运气;RHEL/CentOS Stream 9+ 的 dnf module list dotnet 也只提供旧 LTS 版本。官方推荐方式是加 Microsoft 签名源。
Ubuntu/Debian 正确安装 dotnet-sdk-8.0
跳过官网文档里冗长的 wget + chmod + sh 流程,直接用微软维护的 APT 源:
sudo apt update && sudo apt install -y curl gnupg curl -fsSL https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -o packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo apt update sudo apt install -y dotnet-sdk-8.0
注意三点:
-
$(lsb_release -rs)动态取系统主版本号(如22.04),别手敲错成22.10或jammy - 装完后执行
dotnet --list-sdks,确认输出含8.0.x;如果只有6.0.x,说明源没生效或缓存没刷新 - 不要同时装
dotnet-sdk-6.0和dotnet-sdk-8.0—— 多版本共存虽支持,但dotnet --version默认显示最高版,而项目里global.json指定版本时容易被忽略
CentOS/RHEL/Rocky Linux 安装失败常见原因
报错 Failed to download metadata for repo 'packages-microsoft-com-prod' 或 Cannot find a valid baseurl for repo,基本是这三类问题:
- 系统已停更(如 CentOS 7 / RHEL 7):微软自 2023 年起不再为
rhel/7提供新 SDK,只能降级用dotnet-sdk-6.0,且需手动下载 RPM:curl -O https://packages.microsoft.com/rhel/7/prod/dotnet-sdk-6.0.422-rh.rhel.7-x64.rpm - SELinux 强制模式下阻止仓库元数据下载:临时关掉验证
sudo setenforce 0再试(生产环境请配策略而非关闭) - 用
dnf config-manager --add-repo加源却漏了 GPG 导入:必须补上sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
装完检查 dotnet --info 输出里的 Host version 和 .NET SDKs installed 两栏,别只信 --version。
运行时权限与路径陷阱
即使 dotnet --version 成功,运行程序仍可能失败:
-
Permission denied错误不是因为没给.dll权限,而是dotnet二进制本身被 SELinux 或 AppArmor 限制(尤其在容器外的 Rocky Linux 上)——查日志sudo ausearch -m avc -ts recent -
Could not resolve coreclr path多因当前目录有同名runtimeconfig.json干扰,或DOTNET_ROOT环境变量指向了错误路径(比如指向了旧版 SDK 的shared目录) - 跨架构运行(如 x64 程序丢到 ARM64 服务器)不会报明显错误,而是卡在
dotnet myapp.dll后无响应 —— 先用file myapp.dll看是否为托管程序,再用dotnet --list-runtimes核对目标框架是否匹配
最常被跳过的动作:运行前先 cd 到程序所在目录,别依赖相对路径加载 appsettings.json 或数据库连接字符串里的本地路径。


















