dotnet/runtime 仓库 Mono 运行时构建指南:从环境准备到 Hello World 全流程
dotnet/runtime 仓库 Mono 运行时构建指南从环境准备到 Hello World 全流程【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtimeMono 是 dotnet/runtime 仓库中负责移动端iOS、Android、浏览器WebAssembly以及 WASI 工作负载的 .NET 运行时实现其源码位于 src/mono 目录。本文以 Building Mono 官方文档 为主线完整覆盖从环境准备、运行时与类库协同构建、常用构建参数、特殊平台构建到生成 NuGet 包与运行 Hello World 示例的全流程并结合仓库内的构建工程文件如 mono.proj、Directory.Build.props与示例代码帮助读者在本地真正把 Mono 运行时构建起来并跑通第一个程序。构建前的环境准备在动手之前请先确认你的机器满足构建所必需的软件依赖。dotnet/runtime 仓库针对不同操作系统分别维护了环境要求清单请根据下表选择与当前机器匹配的文档并逐一安装前置依赖WindowsLinuxmacOSWindows 环境要求Linux 环境要求macOS 环境要求说明环境要求中通常包括对应平台的 C/C 编译工具链Windows 上的 VS 组件、Linux/macOS 上的 clang 与 make、CMake、Python 以及 .NET SDK 等。Mono 运行时本身是原生 C 代码通过 CMake 构建因此编译工具链的完整性直接决定构建成败。例如 mono.proj 中会优先选用$(CppCompilerAndLinker)未指定时默认回退到clang。核心构建概念mono 与 libs 的协同构建要得到一个可用的完整运行时环境仅仅构建 Mono 本身是不够的——你还需要同时构建 .NET 类库libraries。这是因为 Mono 作为运行时实现必须搭配System.Private.CoreLib以及其余 BCL 程序集才能执行托管代码。在仓库根目录执行以下命令即可一次性完成运行时 类库的完整构建./build.sh monolibsWindows 下对应的命令为build.cmd monolibs这里需要特别注意默认构建配置默认情况下构建的是debug配置产物位于 debug 输出目录其中包含断言asserts、较少的代码优化调试起来更友好。如果你需要做性能测量或者希望测试跑得更快可以显式切换到 release 配置该配置不含上述检查项只需追加参数./build.sh monolibs -configuration release # 简写形式 ./build.sh monolibs -c release从 src/mono/README.md 可以看到Mono 与 CoreCLR 使用不同的构建子集build subset与宿主配置因此官方工作流文档即本文所依据的 Building Mono是构建 Mono 的权威指引它覆盖了顶层build.sh/build.cmd帮助文本未展开的配置矩阵LLVM、AOT、解释器、WASM、移动端等。常用构建命令详解只构建 Mono 运行时当你已经完成过一次完整构建monolibs后续如果只修改 Mono 相关代码、只想重新构建运行时本身可以使用./build.sh monoWindows 下build.cmd mono构建完成后产品二进制product binaries会输出到artifacts/bin/mono/OS.arch.flavor目录例如 Linux x64 的 debug 构建对应artifacts/bin/mono/Linux.x64.Debug。其中OS、arch、flavor分别表示目标操作系统、架构与构建配置Debug/Release。配合类库测试构建如果你需要针对 Mono 的改动运行类库测试或者运行 HelloWorld 示例则应改用下面的命令它会把类库一并准备到可测试状态./build.sh monolibs.pretestWindows 下build.cmd monolibs.pretestpretest子集会把类库构建成可供测试宿主testhost使用的形式mono.proj 中即定义了 testhost 与运行时目录的推导逻辑。跳过 NuGet 还原的增量构建如果只修改了 Mono 本身、不涉及包依赖变化可以使用--build跳过 nuget 包的还原以加快构建速度./build.sh mono --buildWindows 下build.cmd mono --build常用构建参数构建系统支持通过 MSBuild 属性/p:Namevalue形式来定制 Mono 的构建行为。以下是官方文档列出的高频参数结合源码可进一步理解其作用机理/p:MonoEnableLLVMtrue—— 启用 LLVM 后端Mono 的 JIT/AOT 编译器可以通过 LLVM 后端生成更高质量的机器码。启用方式./build.sh mono /p:MonoEnableLLVMtrue从 mono.proj 的头部注释可以看到MonoEnableLLVM是受支持的构建属性之一其作用在 mono.proj 中体现为当启用 LLVM 时会把 LLVM 优化器llc、opt一并打包进运行时产物MonoBundleLLVMOptimizer并传入 CMake 参数-DLLVM_PREFIX指向 LLVM 安装目录见 mono.proj。/p:MonoLLVMDirpath/to/llvm—— 指定自定义 LLVM 路径当 LLVM 不在默认位置时可显式指定./build.sh mono /p:MonoEnableLLVMtrue /p:MonoLLVMDirpath/to/llvmsrc/mono/Directory.Build.props 的逻辑是当设置了MonoEnableLLVM或MonoAOTEnableLLVM且未显式提供MonoLLVMDir时会启用 NuGet 中的 LLVM SDK 包并将MonoLLVMDir归一化到$(MonoObjDir)/llvm若显式传入了路径则使用你指定的路径。/p:MonoLLVMUseCxx11Abitrue—— 适配 C11 ABI 的 LLVM如果你的自定义 LLVM 是以 C11 ABI 编译的需要追加该参数./build.sh mono /p:MonoEnableLLVMtrue /p:MonoLLVMDirpath/to/llvm /p:MonoLLVMUseCxx11Abitrue这在某些 Linux 发行版使用较新 libstdc ABI 的场景下尤为必要可以避免链接期 ABI 不匹配问题。/p:DisableCrossgentrue—— 跳过安装器构建如果你不需要构建安装器installer可以跳过 crossgen 步骤以加快构建./build.sh mono /p:DisableCrossgentrue/p:KeepNativeSymbolstrue—— 保留原生符号便于调试默认情况下构建会把原生符号剥离到独立文件中若你需要在 lldb 中直接调试 Mono可以保留符号./build.sh mono /p:KeepNativeSymbolstrue该参数在 eng/build.sh 中被实际追加到构建参数列表中官方文档也明确说明它有助于使用 lldb 调试 Mono。其他受支持的 Mono 构建属性除官方文档列出的参数外mono.proj 的注释还揭示了以下可在/p:中使用的属性读者可按需组合MonoForceInterpreter—— 强制启用解释器interpreterMonoAOTEnableLLVM—— 仅对 AOT-only 的 Mono 启用 LLVMMonoVerboseBuild—— 输出详细构建日志MonoThreadSuspend—— 线程挂起模式可选coop、hybrid、preemptiveWasmEnableThreads—— 为 wasm 构建带线程支持的运行时。例如 mono.proj 中展示了默认挂起模式的选择逻辑watchOS 与启用线程的 wasm 默认coopwasm/wasi 默认preemptive不需要安全点其余平台默认hybrid。构建系统还提供大量其他选项随时可以通过build.sh -?Windows 为build.cmd -?查看完整帮助。特殊平台构建WebAssemblyMono 在浏览器场景下以 WebAssembly 为目标平台运行相关构建与运行说明请参阅 Building WebAssembly。仓库中同时维护了丰富的 wasm 示例src/mono/sample/wasm涵盖 console、browser、Blazor frame、事件管道eventpipe、线程等场景。AndroidAndroid 上运行 Mono 的测试方式见 Testing Android。Android 属于交叉编译场景mono.proj 会为 Android/Bionic 目标启用交叉工具链MonoUseCrossTool。iOSiOS含 tvOS、Mac Catalyst 等 Apple 平台的测试方式见 Testing iOS。Apple 平台同样默认构建 AOT 交叉编译器见 mono.proj。生成 NuGet 包如需产出 Mono 运行时对应的 NuGet 包在仓库根目录执行./build.sh packs -runtimeFlavor mono # 可附加 -c release 使用 release 配置 ./build.sh packs -runtimeFlavor mono -c releaseWindows 下build.cmd packs -runtimeFlavor mono生成的包会出现在artifacts/packages/configuration/Shipping目录下典型产物包括Microsoft.NETCore.Runtime.Mono.version-dev.number.1.nupkgruntime.OS.Microsoft.NETCore.Runtime.Mono.version-dev.number.1.nupkgtransport.Microsoft.NETCore.Runtime.Mono.version-dev.number.1.nupkgtransport.runtime.OS.Microsoft.NETCore.Runtime.Mono.version-dev.number.1.nupkg其中transport.*包用于包与包之间的依赖传递场景runtime.OS.*则按操作系统分平台。上手第一个程序Hello World仓库在 src/mono/sample/HelloWorld 提供了一个开箱即用的示例。示例的入口程序 Program.cs 非常巧妙它通过检测System.Private.CoreLib程序集中是否存在Mono.RuntimeStructs类型来判断当前跑在哪个运行时上并打印运行时信息bool isMono typeof(object).Assembly.GetType(Mono.RuntimeStructs) ! null; Console.WriteLine($Hello World {(isMono ? from Mono! : from CoreCLR!)}); Console.WriteLine(typeof(object).Assembly.FullName); Console.WriteLine(System.Reflection.Assembly.GetEntryAssembly()); Console.WriteLine(System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription);从示例目录运行cd ../.. make runMakefile 中的逻辑揭示了它的实际执行路径run目标依赖publish即先调用仓库顶层的dotnet.sh publish以-r $(TARGET_OS)-$(MONO_ARCH)指定运行时标识确保以 SelfContained 方式发布以使用 Mono 而非 CoreCLR随后直接执行artifacts/bin/HelloWorld/arch/config/OS-arch/publish/HelloWorld。Makefile 还暴露了一组非常有用的开关供你体验 Mono 的不同特性组合MONO_CONFIG默认Debug—— 构建配置MONO_ARCH/TARGET_OS—— 目标架构与操作系统由仓库的 init-os-and-arch.sh 自动探测AOT默认false—— 是否启用 AOT 预编译/p:SampleUseAOTFULL_AOT默认false—— 是否启用 Full AOT会追加--full-aot到MONO_ENV_OPTIONSTRIM默认false—— 是否启用裁剪/p:SampleTrimUSE_LLVM默认false—— 是否启用 LLVM 后端/p:MonoEnableLLVMStripILCode/TrimmingEligibleMethodsOutputDirectory—— IL 剥离与裁剪方法输出目录。对应的 HelloWorld.csproj 中PublishTrimmed、RunAOTCompilation、SampleAOTModenormal/full会根据上述开关联动当启用 AOT 时还会通过MonoAOTCompiler任务对发布目录下的所有程序集执行 AOT 编译见 HelloWorld.csproj并可选地执行 IL 剥离ILStrip。小贴士如果希望直接看到 Mono 与 CoreCLR 的输出差异可以在同一台机器上用dotnet runCoreCLR与make runMono分别运行该示例Program.cs输出的第一行会明确告诉你当前是哪个运行时。重要提示与故障排查官方文档还给出了三点非常实用的提醒测试二进制暂未对 Mono 提供Test binaries are not yet available for mono因此不要期望mono子集直接产出测试程序集如需测试请使用monolibs.pretest或参考 Testing Mono 文档。构建日志统一放在artifacts/log目录。当构建失败时这里是最重要的第一手排查资料日志中记录了完整的 MSBuild 输出与错误堆栈。构建的所有中间产物都在artifacts/obj/mono目录。如果你怀疑存在脏状态、希望强制全量重建删除该目录后重新执行构建命令即可注意原文档使用remove/rm -rf描述该操作删除前请自行确认。总结Mono 的构建链路清晰地分为两条主线mono子集负责原生运行时含 LLVM、AOT、解释器、交叉编译等配置矩阵libs及libs.pretest负责类库与测试宿主两者通过monolibs组合命令协同产出完整运行时环境。掌握本文中的构建命令与/p:参数MonoEnableLLVM、MonoLLVMDir、DisableCrossgen、KeepNativeSymbols等再配合 HelloWorld 示例 的make run验证即可在本地完成从源码到可运行 Mono 应用的全流程闭环为后续深入 Mono 源码调试与移动端/浏览器端开发打下基础。【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

测试左移实践:从提交到部署的完整质量门禁链路

测试左移实践:从提交到部署的完整质量门禁链路

从提交到部署这条线,很多团队其实是断的:开发在本地把代码写完,commit 一推,后面发生了什么基本靠猜。CI 挂了就在群里喊人看,部署出了问题就在服务器上翻日志,测试环境不稳定就互相甩锅。我早年也这么干过…

2026/9/20 4:02:58 阅读更多 →
Dijkstra算法课程设计实战:邻接矩阵与最短路径输出完整解析

Dijkstra算法课程设计实战:邻接矩阵与最短路径输出完整解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 4:02:58 阅读更多 →
CANN ops-math OnesLike 算子全解析:原型设计、两段式 aclnn 调用与 NPU 源码实现

CANN ops-math OnesLike 算子全解析:原型设计、两段式 aclnn 调用与 NPU 源码实现

算子库人工智能CANN 【免费下载链接】ops-math 本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-math 点击查看 免费下载 OnesLike 是 CANN ops-math 数学算子库中用于"复制形状、填充…

2026/9/20 4:02:58 阅读更多 →

最新新闻

Spaceship Prompt 加载自定义 Sections 完全指南:安装、加载与命令行管理

Spaceship Prompt 加载自定义 Sections 完全指南:安装、加载与命令行管理

Spaceship Prompt 加载自定义 Sections 完全指南:安装、加载与命令行管理 【免费下载链接】spaceship-prompt 🚀✨ Minimalistic, powerful and extremely customizable Zsh prompt 项目地址: https://gitcode.com/gh_mirrors/sp/spaceship-prompt …

2026/9/20 4:45:15 阅读更多 →
局域网终端管控落地指南:从资产盘点到准入与共享权限

局域网终端管控落地指南:从资产盘点到准入与共享权限

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 4:45:15 阅读更多 →
AI调试Agent的Skill设计:别再往技能里塞一切,Agent动脑,Skill动手

AI调试Agent的Skill设计:别再往技能里塞一切,Agent动脑,Skill动手

最近我们团队在啃一个内部项目,名字很直白:AI Debug Engineer。目标是让Agent拿到一份报错信息、一堆日志、一个编译失败的仓库时,能像一位有三年经验的工程师一样定位问题、给出修复建议,甚至自动跑测试验证。项目推进到第二周&a…

2026/9/20 4:45:15 阅读更多 →
OpenResearch:面向科研工作者的本地优先CLI研究协作者

OpenResearch:面向科研工作者的本地优先CLI研究协作者

1. 项目概述:一个真正“本地优先”的学术研究协作者OpenResearch 不是一个新发布的 SaaS 工具,也不是某个大厂刚推出的 AI 插件。它是一套面向科研工作者、独立学者、开源知识共建者设计的命令行原生、数据主权在手、离线可用、可审计可复现的研究协作协…

2026/9/20 4:45:15 阅读更多 →
DeepSeek Harness长任务管理实战:goal、compact与后台job三件套使用指南

DeepSeek Harness长任务管理实战:goal、compact与后台job三件套使用指南

长任务做到一半失控这件事,我用 DeepSeek Harness 踩过太多次了:上一个小时它还在按需求文档改接口,下一个小时就自己发明了一个新架构,把原本说好不动的地方全给重构了。后来我把版本升到 2026 年 9 月这一版,才真正把…

2026/9/20 4:45:15 阅读更多 →
OpenResearch:用开源工作流构建可复现的个人研究基础设施

OpenResearch:用开源工作流构建可复现的个人研究基础设施

1. 项目概述与设计思路1.1 OpenResearch 到底是什么我做个人研究项目这么多年,感触最深的一件事就是:研究过程本身的信息管理,往往比研究内容更耗费精力。早期做课题时,文献散落在各个文件夹,实验数据存在不同格式的表…

2026/9/20 4:44:15 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →