c# - 运行已解压缩的控制台应用程序时出现 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);
解决方案
推荐阅读
- java - 错误:二元运算符'+'的错误操作数类型我没有得到我错的地方
- c++ - 在 std 运算符重载上选择性地强制优化
- node.js - 使用 sendgrid 的 UnhandledPromiseRejectionWarning
- reactjs - 将 Flipmove 添加到材料表但不起作用
- javascript - 在对象数组中保留每个月的读取计数
- python - 如何在 CSV 中使用 LSTM 层
- python - 如何使用 get_dummies 或一种热编码来编码具有多个元素的分类特征?
- r - 动作按钮输入闪亮后更新单选按钮
- csv - d3.csv 找不到输入文件
- c# - 在 Entity Framework Core 中使用 Sqlite 时,如何映射 SQLite“rowid”和我定义的主键?