C#解释器实现文本文件嵌入可执行文件打包功能遇错求助
解决Mono.Cecil嵌入资源时的BadImageFormatException问题
问题根源
你遇到的System.BadImageFormatException主要来自两个核心原因:
- 单文件发布的exe结构特殊:.NET 5+的单文件发布产物并非标准PE程序集,而是包含引导加载器和压缩程序集的打包文件,Mono.Cecil无法直接解析这种非标准格式。
- 平台架构不匹配:运行Mono.Cecil代码的程序与目标exe的CPU架构(x86/x64/ARM)不一致,导致解析失败。
解决方案
1. 改用非单文件发布的目标exe
放弃单文件发布,直接使用普通发布的exe(带依赖dll的版本),Mono.Cecil可以正常解析这类标准PE程序集。
发布命令示例:
dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=false
2. 调整Mono.Cecil读取参数(针对非单文件exe)
如果目标exe是标准程序集但仍报错,尝试指定ReaderParameters并匹配目标架构:
var readerParams = new ReaderParameters { ReadingMode = ReadingMode.Deferred, Architecture = TargetArchitecture.Amd64 // 匹配目标exe的架构,如x86则设为X86 }; var module = AssemblyDefinition.ReadAssembly("z.exe", readerParams); var file = new EmbeddedResource( "program.zr", ManifestResourceAttributes.Public, File.ReadAllBytes("a.zr") ); module.MainModule.Resources.Add(file); module.Write("c.exe");
3. 单文件exe的处理方案
如果必须使用单文件发布的exe,需要先提取其中的实际程序集:
- 运行单文件exe时,它会自动解压到临时目录,可在临时目录中找到实际的程序集文件(通常是
z.dll或z.exe)。 - 或用
dotnet工具手动提取:
dotnet z.exe --extract-to ./extracted
提取完成后用Mono.Cecil处理该程序集,处理完再重新打包为单文件。
4. 升级Mono.Cecil版本
确保使用最新稳定版的Mono.Cecil NuGet包,新版本对.NET Core/.NET 5+程序集的兼容性更好。
运行时读取嵌入资源
打包完成后,在你的解释器中读取嵌入资源的代码示例:
using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("program.zr"); if (stream != null) { using var reader = new StreamReader(stream); var content = reader.ReadToEnd(); // 执行你的解释逻辑 }
内容的提问来源于stack exchange,提问作者InvaderIzzy
相关产品推荐
相关产品推荐

