一聚教程网:一个值得你收藏的教程网站

热门教程

Linux下如何安装Mono运行.NET程序

时间:2026-06-24 08:01:57 编辑:袖梨 来源:一聚教程网

直接安装 mono-complete 即可,但需确认系统发行版及依赖完整性;Ubuntu/Debian 推荐 apt 安装官方预编译包,执行 sudo apt update && sudo apt install mono-complete 后用 mono --version 验证版本 ≥ 6.8,缺 libmono-native0 时需手动补装。

直接装 mono-complete 就行,但得看清楚系统发行版和依赖是否到位——很多“安装成功却跑不了程序”的问题,其实出在缺底层库或版本错配上。

Ubuntu/Debian 系统:用 apt 装最稳

官方源里有预编译包,兼容性好、更新及时。执行以下命令即可:

  • sudo apt update
  • sudo apt install mono-complete

装完立刻验证:mono --version 应该输出类似 6.12.0.122 的版本号。注意别只看有没有输出,还要确认版本 ≥ 6.8(太老的 Mono 对 .NET Framework 4.7+ 支持差,尤其涉及 TLS 1.2 或 System.Numerics 类型时容易崩溃)。

常见错误现象:mono: error while loading shared libraries: libmono-native.so.0: cannot open shared object file —— 这是 mono-complete 依赖的 libmono-native 包没被自动拉取,补装:sudo apt install libmono-native0

CentOS/RHEL 8+:dnf + Microsoft 官方源更可靠

系统自带仓库里的 Mono 版本普遍偏旧(如 RHEL 8 默认只有 6.8,但缺 mono-develmono-xsp4),建议换 Microsoft 官方源:

  • 导入 GPG 密钥:sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
  • 添加源:sudo dnf config-manager --add-repo https://packages.microsoft.com/rhel/8/prod/
  • 安装:sudo dnf install mono-complete

为什么不用 yum?RHEL 8+ 已弃用 yum,用 dnf 才能正确解析依赖树。若仍用 yum install mono-complete,大概率会卡在 libgdiplus 缺失,导致 Web 程序图片渲染失败或 System.DrawingDllNotFoundException

手动编译 Mono:仅限特殊需求,慎选

除非你明确需要调试 CLR 源码、或目标系统完全离线且无法加源(比如某些国产信创 OS),否则不建议自己编译。它对构建环境要求高,容易踩坑:

  • 必须提前装全 gccmakepkg-configglib2-devellibpng-devel 等二十多个开发包
  • configure 阶段若漏掉 --with-libgdiplus 参数,生成的 mono 二进制将无法加载图形相关 DLL
  • 编译中报 undefined reference to locale_charset 是经典错误,本质是 libiconvgettext 版本不匹配,需手动 patch eglib/config.h 关闭 HAVE_LOCALCHARSET_H

编译耗时长(单核机器常超 30 分钟),且后续升级只能重编——不如用包管理器。

运行 .NET Framework 程序前必查三件事

装完 Mono 不等于能跑通程序,实际执行 mono YourApp.exe 前,请确认:

  • 你的程序是用 .NET Framework(不是 .NET Core / .NET 5+)编译的,Mono 只兼容前者;dotnet YourApp.dll 这种写法在 Mono 下无效
  • 所有依赖 DLL 必须和 EXE 在同一目录,或已注册到 GAC(用 gacutil -i);Mono 不读 Windows 的 PATHGAC_MSIL
  • 若程序用到 WPF、Windows Forms 或 COM 组件,Mono 基本不支持——这些 UI 框架在 Linux 上无对应实现,强行运行只会抛 NotSupportedException

最容易被忽略的是:Mono 默认不启用 JIT 的 full-aot 模式,但某些嵌入式场景或容器里会因内存限制触发 fallback 到 interpreter,性能骤降且调试信息极少。这时得加 --aot=full 参数启动,但前提是编译时已用 mcsmsc 指定 target framework 为 net472 级别。

热门栏目