首页 > 解决方案 > 运行已解压缩的控制台应用程序时出现 BadImageFormatException 错误

问题描述

我开发的 Windows 服务和控制台应用程序有一个非常奇怪的问题。windows服务是用c#.net core编写的。它的作用是获取一个预构建的 .net 核心控制台应用程序的 zip 文件并将其解压缩到一个位置,然后调用 Process.Start 来运行它。

有多个线程调用服务,然后该服务将解压缩文件(如果尚未解压缩),然后为每个请求线程调用 Process.Start。解压缩是线程安全的。

发生的情况是,有时当控制台应用程序启动时,它会因随机 dll 上的 BadImageFormatException 而崩溃。对 process start 的任何后续调用都将在同一个 dll 上因相同的错误而崩溃。

如果我停止服务并手动运行控制台应用程序,它会崩溃并出现相同的 BadImageFormatException 错误。

现在这很奇怪。如果我将控制台应用程序所在的文件夹复制到同一台机器上同一驱动器上的另一个位置并运行它 - 它可以正常工作。

如果我将具有 BadImageFormatException 的 dll 从原始文件夹复制到临时文件夹,请删除原始 dll,然后将备份复制回原始文件夹并重新运行应用程序 - 它可以正常工作。

我一直在努力想出这背后的原因。如果相同的应用程序可以在同一台机器上运行,只需将其复制到另一个文件夹,那么会导致 .net 核心控制台应用程序出现 BadImageFormatException 吗?

从 2012 r2 到 2016 年,我在几台 Windows 服务器机器上看到了这一点。

更新

因此,从更多测试看来,每当我在运行控制台应用程序时遇到 BadImageFormatException 时,我都可以通过使用 sysinternals 中的 RAMMap 清除 Windows 文件缓存来让它再次工作。

所以现在的问题是为什么文件缓存中的 dll 被修改或损坏?我一次启动多个进程(有时最多 40 个),但这不应该导致 dll 被修改并抛出 BadImageFormatException 。.NetCore 加载方式有什么问题吗?还是我解压文件夹的方式?我正在使用 System.IO.Compression zip 库,例如:

ZipFile.ExtractToDirectory(zipFile, outFolder);

标签: c#.net.net-corezip

解决方案


推荐阅读