You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 01:45:19