You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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包:
    1. 创建目录结构:mkdir -p YourApp.app/Contents/MacOS
    2. 把刚才生成的YourProgram移动到YourApp.app/Contents/MacOS/目录下
    3. 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>
      
    4. 给可执行文件添加运行权限: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
  • 发布完成后,去项目目录下的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

火山引擎 最新活动