加载.NET 8.0 exe时遇“Bad IL format”错误,能否将其作为程序集打开?
.NET 8.0 EXE能否作为程序集加载?
答案是可以,但得看你的EXE是哪种类型。
错误原因
你碰到的「Bad IL format. The format of the file '<file_path>.exe' is invalid.」错误,核心原因是.NET 8.0默认生成的EXE可能属于以下两种非标准IL程序集类型:
- 单文件发布的EXE:这是打包了.NET运行时和程序集的自包含文件,本身不是直接可加载的纯IL程序集。
- 本机AOT编译的EXE:已经直接编译成机器码,完全没有保留IL代码,自然无法被
Assembly.LoadFrom这类针对IL程序集的加载方法识别。
而将<OutputType>改为Library后生成的DLL是标准.NET类库,属于纯IL格式,因此加载完全正常。
可行的解决办法
要让EXE能被作为程序集加载,需要调整项目的编译/发布设置:
- 关闭单文件发布:在项目设置中取消勾选「单文件」选项,或者在
.csproj文件中添加<PublishSingleFile>false</PublishSingleFile>配置。 - 禁用本机AOT:确保项目中没有启用
<PublishAot>true</PublishAot>配置,因为AOT编译会将IL代码彻底转换为机器码,无法再作为程序集加载。 - 生成框架依赖的EXE:这种EXE本质是一个轻量级启动器,真正的程序集内容会存放在同名的
.dll文件中(比如YourApp.exe对应YourApp.dll),你可以直接加载该DLL;如果是框架依赖且非单文件的EXE,本身也包含IL代码,直接加载EXE文件也可以正常工作。
另外,也可以先将EXE文件读取为字节流,再通过Assembly.Load(byte[])方法加载,但这种方式仅对包含IL代码的EXE有效,单文件或AOT编译的EXE依旧无法加载。
总结
只要你的.NET 8.0 EXE是框架依赖、非单文件、非AOT编译的标准IL格式EXE,就可以用Assembly.LoadFrom或Assembly.LoadFile正常加载。如果是单文件或AOT编译的EXE,则无法直接作为程序集加载,只能通过改为Library或者调整编译设置来解决问题。
内容的提问来源于stack exchange,提问作者Yola
相关产品推荐
相关产品推荐

