如何生成不含IL、JIT、元数据的轻量.NET单文件.exe
生成依赖系统.NET运行时的轻量原生EXE文件
要生成不含IL、JIT、元数据,且不嵌入.NET DLL的轻量单EXE,核心是用.NET的Native AOT发布功能,同时指定依赖系统全局安装的.NET运行时,而非打包运行时组件。最终生成的是纯原生机器码EXE,体积通常只有几MB。
具体操作步骤:
确认项目兼容性
项目需为控制台、Windows Forms或WPF应用,目标框架至少选.NET 7(推荐.NET 8,Native AOT支持更成熟)。同时要排查移除项目里不兼容AOT的特性,比如动态反射加载、部分非AOT友好的NuGet包。修改项目配置文件
打开.csproj(C#)或.vbproj(VB.NET)文件,添加以下配置:<PropertyGroup> <PublishAot>true</PublishAot> <SelfContained>false</SelfContained> <!-- 关键:不打包运行时,依赖系统全局.NET --> <PublishSingleFile>true</PublishSingleFile> <PublishTrimmed>true</PublishTrimmed> <!-- 可选:裁剪冗余代码进一步减小体积 --> </PropertyGroup>执行发布命令
打开终端切换到项目目录,运行发布命令(以x64平台为例):dotnet publish -c Release -r win-x64 --no-self-contained按需替换
win-x64为win-x86或win-arm64以匹配目标机器架构。--no-self-contained参数会明确告知编译器不要把.NET运行时打包进EXE。验证结果
发布完成后,在bin/Release/net[版本号]/win-x64/publish目录下就能找到单个EXE文件。这个文件是纯原生机器码,没有IL、JIT编译器,也不会嵌入.NET DLL,运行时会自动调用系统中已安装的对应版本.NET运行时。
注意事项:
- 目标机器必须预先安装好对应版本的.NET运行时(比如用.NET 8发布,目标机器就得装.NET 8 Runtime)
- 如果项目用到了动态反射这类特性,需要额外创建
rd.xml文件配置AOT兼容规则,否则可能出现运行错误 - VB.NET项目完全适用上述配置,只需修改对应的
.vbproj文件即可
内容的提问来源于stack exchange,提问作者Remus Rigo
相关产品推荐
相关产品推荐

