如何在Linux与macOS系统下使用ilasm编译.NET CIL中间代码?
跨平台编译CIL代码的解决方案
核心原理说明
ilasm 无论哪个平台版本,默认生成的都是PE格式的托管程序集(CLI规范的变种格式),这种程序集本身是跨平台的——.NET运行时在Linux/macOS上都能加载运行,但无法被系统直接当作原生可执行文件(Linux用ELF、macOS用mach-o)执行。要生成对应平台的原生可执行文件,需要配合.NET的发布工具完成打包。
方法一:先编译托管程序集,再跨平台发布
用ilasm编译CIL为托管程序集
不管Windows/Linux/macOS,先编译出托管的.dll或.exe(这里的.exe是PE格式托管文件,不是原生可执行):# Windows环境 ilasm mycode.il /dll /output:myassembly.dll # Linux/macOS环境(需先安装.NET SDK,通过dotnet调用ilasm) dotnet ilasm mycode.il /dll /output:myassembly.dll注:如果生成.exe,Linux/macOS上可通过
dotnet myassembly.exe运行,但不能直接执行。创建.NET项目并发布到目标平台
- 先创建一个基础控制台项目(用于承载托管程序集):
dotnet new console -n ILAppWrapper cd ILAppWrapper # 将编译好的托管程序集添加到项目引用 dotnet add reference ../myassembly.dll - 执行跨平台发布命令:
# 发布到Linux x64,生成ELF原生可执行文件 dotnet publish -r linux-x64 -c Release --self-contained false # 发布到macOS x64 dotnet publish -r osx-x64 -c Release --self-contained false # 发布到Windows x64 dotnet publish -r win-x64 -c Release --self-contained false
发布完成后,
bin/Release/netX.X/目标运行时/publish目录下会出现对应平台的原生可执行文件(Linux下无后缀、macOS为可执行文件、Windows下为.exe)。- 先创建一个基础控制台项目(用于承载托管程序集):
方法二:.NET 6+ 直接配合dotnet ilasm发布(推荐)
从.NET 6开始,dotnet ilasm支持直接生成可用于发布的项目结构,简化流程:
编译CIL并生成项目文件
dotnet ilasm mycode.il /exe /output:myapp.exe /project该命令会自动生成
myapp.csproj,无需手动创建项目。直接发布到目标平台
# 发布到Linux x64并打包运行时(可直接在目标系统执行,无需预装.NET) dotnet publish -r linux-x64 -c Release --self-contained true
关键注意点
- 托管程序集本身是跨平台的,只要.NET运行环境存在,就能在任意平台通过
dotnet 程序集文件名运行。 - 生成原生平台可执行文件的核心是.NET发布工具,而非ilasm——ilasm只负责生成符合CLI规范的托管CIL代码,发布工具负责将其与运行时组件打包为目标平台支持的原生格式。
内容的提问来源于stack exchange,提问作者Gabriel Frigo
相关产品推荐
相关产品推荐

