ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

dotnet/runtime 仓库 Mono 运行时构建指南:从环境准备到 Hello World 全流程

2026/9/20 4:03:06 拓冰建站 浏览量
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),仅供参考