如何在Mac OS上编译和执行C#程序?

来源:程序开发作者:广州GEO公司头衔:草根站长
导读:本期聚焦于广州GEO公司创作的《如何在Mac OS上编译和执行C#程序?》,敬请观看详情。想在 macOS 上编译并运行 C#,并不需要安装庞大的 Visual Studio,.NET SDK 自带的 Roslyn 编译器与运行时已经能把源码变成可执行程序。本文从环境安装开始,演示终端下用 dotnet CLI 创建控制台项目、执行 dotnet run 的完整流程,并进一步拆解 dotnet build 与直接运行 DLL 的区别。同时介绍直接调用 csc 编译器的手工方式,以及利用 Visual Studio Code 进行断点调试的配置。整个过程以终端命令为主,兼顾图形化编辑器的效率提升。读者可以了解 .csproj 项目文件的作用,掌握生成 Debug 与 Release 两种构建产物,学会处理编译失败与依赖还原问题,并在 Mac 上建立起清晰的 C# 编译与执行链路。

在 macOS 上编译和执行 C# 程序,本质上依赖 .NET SDK 提供的两条链路:Roslyn 编译器负责把源码翻译成中间语言程序集,CoreCLR 运行时负责加载并执行这些程序集。只要终端里安装了 dotnet 命令,就能完成从项目创建、编译、运行到发布的完整闭环,不必依赖 Visual Studio。下面围绕 dotnet CLI 这条主线,把环境准备、编译方式和执行细节讲清楚。

如何在Mac OS上编译和执行C#程序?

一、安装 .NET SDK 与验证环境

macOS 上获取 .NET SDK 主要有两种方式:从微软官网下载 pkg 安装包,或者使用 Homebrew 安装。Homebrew 的命令更简洁,适合已经配置好包管理器的用户。执行 brew install --cask dotnet-sdk 后,安装器会把 dotnet 命令加入 PATH,同时将 SDK 部署到 /usr/local/share/dotnet 或 Apple Silicon 机器上的 /opt/homebrew/share/dotnet 目录。

安装完成后打开终端,输入 dotnet --version 能输出具体版本号,就说明 dotnet CLI 已经可用。如果提示 command not found,可以检查 Shell 配置文件里是否包含 dotnet 路径,或重新打开一个终端窗口使环境变量生效。接着执行 dotnet --list-sdks 和 dotnet --list-runtimes,可以清楚看到当前 SDK 与运行时是否匹配。

brew install --cask dotnet-sdk
dotnet --version
dotnet --list-sdks
dotnet --list-runtimes

需要特别注意的是,.NET SDK 与 .NET Runtime 是两个层次。SDK 里包含编译器、项目模板和构建工具,Runtime 只负责运行已经编译好的程序集。开发机上安装 SDK 后,运行时会包含对应版本的 Microsoft.NETCore.App,因此执行 C# 程序不会缺少运行时依赖。只有目标机器上才会单独安装 Runtime。

二、创建并运行第一个控制台程序

使用 dotnet new console -n HelloMac 可以快速生成一个控制台项目。命令会在当前目录下创建 HelloMac 文件夹,里面包含 HelloMac.csproj 项目文件和 Program.cs 源代码。.csproj 文件采用 SDK 风格,核心内容通常只有几行,默认目标框架类似 net8.0,它会指示构建系统按照某个 .NET 版本进行编译。打开 Program.cs,可以看到顶层语句直接输出 Hello, World!,这是 C# 较新的简洁入口风格。

// Program.cs
Console.WriteLine("Hello, World!");

进入项目目录执行 dotnet run,dotnet CLI 会依次完成依赖还原、编译和运行。首次执行时,还原 NuGet 包可能会稍慢,随后就能在终端看到输出结果。这一命令非常适合开发调试,因为每次修改源码后只需重复执行同一命令,就能立刻看到变化。

cd HelloMac
dotnet run

从执行结果看,dotnet run 并不是单纯启动编译器,它背后会生成 bin 和 obj 目录。obj 保存编译过程中的中间文件、资源清单和缓存,bin 保存最终程序集与依赖。最终生成的 DLL 文件位于 bin/Debug/net8.0/HelloMac.dll,这个文件就是可以被 .NET 运行时加载的程序集。理解这一点,后续拆解编译与运行步骤时会更加清晰。

三、编译与执行分离:dotnet build 和直接运行 DLL

如果只想验证编译是否通过,而不启动程序,可以使用 dotnet build。它会读取 .csproj 文件,调用 MSBuild 引擎组织编译,最终在 bin 目录生成程序集。编译成功后终端会显示 Build succeeded,并列出警告和错误数量。对于持续集成或提交代码前的检查,这一命令比 dotnet run 更合适。

dotnet build
dotnet bin/Debug/net8.0/HelloMac.dll

第二条命令展示了直接运行程序集的方式:把 DLL 文件作为参数传给 dotnet 命令。因为编译产生的 HelloMac.dll 是一个 .NET 程序集,不是 macOS 原生 Mach-O 可执行文件,所以不能像原生程序那样直接双击或执行。熟悉跨平台 .NET 的开发者会注意到,这与 Java 的 jar 包运行方式类似,都需要运行时宿主来加载。

分离编译与执行还有一个好处:可以单独控制构建配置和输出路径。例如执行 dotnet build -c Release 会生成 Release 版本,代码经过更多优化,体积更小、性能更好。输出时终端会显示 config: Release,生成路径则变为 bin/Release/net8.0/HelloMac.dll。调试阶段通常使用 Debug 配置,发布时切换 Release。

四、直接使用 csc 编译单个 C# 文件

除了项目级别的 dotnet build,.NET SDK 还自带 Roslyn 编译器命令 csc。它的好处是不依赖 .csproj 文件,适合编译单个源码文件或理解编译器的底层行为。安装 SDK 后,csc 通常位于 /usr/local/share/dotnet/sdk/版本号/Roslyn/bincore/csc.dll,需要用 dotnet 加载。直接输入 csc 不一定可用,因为 PATH 中可能没有指向这个目录。

cd /usr/local/share/dotnet/sdk/8.0.404/Roslyn/bincore
dotnet csc.dll /out:hello.dll /target:library hello.cs

上面命令假设已知 SDK 版本目录。更推荐的方式是让 dotnet 自动解析 SDK 路径,通过 dotnet new console 或 dotnet build 管理引用。手工调用 csc 时,需要手动指定输出文件名、目标类型和源码文件,一旦引用了 System.Console 之外的库,还要手动添加引用,复杂度明显上升。因此 csc 更适合做编译实验或排查语言特性问题,日常开发仍应以 dotnet CLI 项目体系为主。

如果想观察 csc 的具体参数,可以执行 dotnet csc.dll /help。它会列出输出类型、优化、调试信息、语言版本等大量选项。比如使用 /optimize+ 开启优化,使用 /debug+ 生成 PDB 调试符号。需要注意的是,这种手工编译方式缺少 NuGet 还原和框架引用自动处理,遇到复杂项目时容易出错。

五、用 Visual Studio Code 管理编译与调试

终端命令适合快速操作,但大型项目需要代码提示、断点调试和测试集成。macOS 上可以安装 Visual Studio Code,并搜索 C# Dev Kit 扩展。安装后打开 .csproj 所在文件夹,扩展会自动识别项目,生成 .vscode 目录,其中 launch.json 用于配置调试启动,tasks.json 用于配置构建任务。

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": ".NET Launch (console)",
      "type": "coreclr",
      "request": "launch",
      "preLaunchTask": "build",
      "program": "${workspaceFolder}/bin/Debug/net8.0/HelloMac.dll",
      "args": [],
      "cwd": "${workspaceFolder}",
      "stopAtEntry": false
    }
  ]
}

上面 launch.json 中的 program 字段指向编译生成的 DLL 文件,preLaunchTask 指定调试前自动执行名为 build 的任务。按下 F5 后,VS Code 会先调用 dotnet build 完成编译,再通过 coreclr 调试器启动程序。断点、单步执行、变量查看等操作都在编辑器内完成,这比纯终端调试直观很多。

需要注意的是,如果项目从旧版本迁移或没有自动生成 tasks.json,可以手动创建构建任务。任务内容通常是调用 dotnet build,并把当前工作目录设置为工作区。配置完成后,VS Code 的终端面板也能直接运行 dotnet CLI,编辑器与终端并不冲突,二者可以结合使用。对于大多数个人项目和中小型服务,这种组合已经足够轻量高效。

C#Mac OSdotnet CLI修改时间:2026-09-20 10:40:09

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/0920/59613.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。