无需Visual Studio,如何创建macOS通用架构.NET Core自包含应用
构建macOS通用架构(x86_64/arm64)的自包含.NET Core应用方案
核心结论
目前不存在完全平台无关的.NET Core运行时DLL,因为核心组件(如System.Private.CoreLib.dll)包含架构特定的原生代码,无法跨x86_64/arm64通用。以下是无需依赖Visual Studio for Mac的可行方案:
方案一:双架构打包+架构检测启动脚本(最成熟可靠)
这是当前实现通用架构自包含应用的标准方式,通过分别构建两个架构版本,用脚本根据系统架构动态启动对应版本,同时复用相同文件减少体积:
步骤1:分别发布两个架构的自包含版本
执行以下命令生成两个架构的独立发布包:
dotnet publish -c Release -r osx-x64 --self-contained -o ./publish/x64 dotnet publish -c Release -r osx-arm64 --self-contained -o ./publish/arm64
步骤2:构建通用.app包结构
创建标准的macOS应用包目录结构,示例如下:
MyApp.app/ └── Contents/ ├── Info.plist # 应用配置文件,按需编写 └── MacOS/ ├── x64/ # 存放osx-x64的发布文件 ├── arm64/ # 存放osx-arm64的发布文件 └── MyApp # 架构检测启动脚本
步骤3:编写启动脚本
在MyApp.app/Contents/MacOS/下创建名为MyApp的脚本,内容如下:
#!/bin/bash # 检测当前系统架构 ARCH=$(uname -m) # 根据架构启动对应版本的应用 if [ "$ARCH" = "arm64" ]; then exec "$(dirname "$0")/arm64/MyApp" "$@" else exec "$(dirname "$0")/x64/MyApp" "$@" fi
给脚本添加执行权限:
chmod +x MyApp.app/Contents/MacOS/MyApp
步骤4:复用相同文件减少体积
对比x64和arm64目录下的文件,将业务DLL、资源文件等架构无关的相同文件移到共享目录(如../Shared/),然后在两个架构目录中创建符号链接指向共享文件,避免重复存储。
关于"平台无关运行时"的说明
.NET Core的核心运行时组件(包括System.Private.CoreLib.dll)包含针对特定架构优化的原生代码(如JIT编译器、平台系统调用逻辑),因此不存在完全跨x86_64/arm64的通用运行时DLL,必须为每个架构单独提供对应的运行时文件。
内容的提问来源于stack exchange,提问作者Bri Bri
相关产品推荐
相关产品推荐

