如何使用Mono将Windows平台C#程序导出为Mac应用
嘿,我来帮你搞定这个跨平台打包的问题!你已经在Windows上用Mono成功生成了C#的.exe,但要让它在Mac上无需依赖第三方程序直接运行,其实有两种靠谱的方法,我给你详细拆解一下:
方法一:用Mono的
mkbundle工具打包成Mac原生.app Mono本身提供了打包工具能把你的.NET程序转换成目标平台的可执行文件,再包装成Mac的.app包,步骤如下:
- 首先得在Mac上安装Mono(因为
mkbundle需要在目标平台环境下操作,交叉编译比较麻烦,直接在Mac上弄更省心) - 把你在Windows上写的C#源码或者编译好的程序集(.dll、.exe文件)拷贝到Mac的某个目录里
- 打开Mac的终端,cd到程序所在的文件夹
- 运行命令生成Mac可执行文件:
mkbundle YourProgram.exe -o YourProgram,这里的YourProgram就是生成的Mac可执行文件 - 接下来要把这个可执行文件包装成标准的.app包:
- 创建目录结构:
mkdir -p YourApp.app/Contents/MacOS - 把刚才生成的
YourProgram移动到YourApp.app/Contents/MacOS/目录下 - 在
YourApp.app/Contents/目录下创建Info.plist文件,内容可以参考下面的模板(记得替换成你的应用信息):<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleExecutable</key> <string>YourProgram</string> <key>CFBundleName</key> <string>YourApp</string> <key>CFBundleIdentifier</key> <string>com.yourdomain.yourapp</string> <key>CFBundleVersion</key> <string>1.0</string> <key>CFBundleShortVersionString</key> <string>1.0</string> </dict> </plist> - 给可执行文件添加运行权限:
chmod +x YourApp.app/Contents/MacOS/YourProgram
- 创建目录结构:
- 做完这些,
YourApp.app就是一个可以直接在Mac上双击运行的应用包了
方法二:用.NET Core/.NET 5+跨平台发布(更推荐)
现在Mono已经逐渐被官方的.NET跨平台框架替代,用这个方法打包的程序兼容性更好,步骤也更简洁:
- 先确认你的C#项目已经迁移到.NET Core 3.1或更高版本(如果还没迁移,只需要把项目文件改成对应的SDK格式就行,大部分代码不需要改动,只要没用到Windows专属API)
- 在Windows上打开命令提示符或PowerShell,cd到你的项目目录
- 运行发布命令:
- 针对Intel芯片的Mac:
dotnet publish -c Release -r osx-x64 --self-contained true - 针对Apple Silicon芯片的Mac:
dotnet publish -c Release -r osx-arm64 --self-contained true
- 针对Intel芯片的Mac:
- 发布完成后,去项目目录下的
bin/Release/netX/osx-xxx/publish/(netX是你的.NET版本,osx-xxx是对应的架构),里面会有Mac的可执行文件和所有依赖 - 你可以把这个publish文件夹里的内容打包成.app包(方法和上面一样),或者直接把整个文件夹发给Mac用户,他们可以直接运行里面的可执行文件
一些注意事项
- 如果你的程序有UI,比如用了WinForms,Mono在Mac上是支持的,但可能需要调整一些界面布局;如果是WPF,Mono不支持,建议换成MAUI、Avalonia这类跨平台UI框架
- 用
--self-contained true参数会把.NET运行时一起打包,用户不需要提前安装.NET或Mono,直接就能运行 - 不管用哪种方法,都建议在Mac上测试一下,确保没有依赖缺失或者平台兼容问题
内容的提问来源于stack exchange,提问作者Serpent




