本文记录 SQLite.Interop.dll 由于 mscoree.dll 文件损坏而在加载时抛出 BadImageFormatException 错误,错误信息是 0x8007000B 试图加载格式不正确的程序
表现行为是在开发者电脑上能好好运行,在大部分用户设备上能好好运行,只有在个别用户的设备上运行报错
对应的英文错误信息如下
常见的错误堆栈如下
或
错误原因是 mscoree.dll 文件损坏,这个 mscoree.dll 不是放在应用程序文件夹下的,所在的系统路径如下
- x64:
C:\Windows\System32\mscoree.dll
- x86:
C:\Windows\SysWOW64\mscoree.dll
如果当前能抓到复现的系统环境,可以尝试用自己开发机正常的 mscoree.dll 替换出现问题的机器的文件,预期替换之后能正常工作。如替换之后不能正常工作,可能是错误将 x86 和 x64 文件给混了,或者是 SQLite.Interop.dll 文件本身或其他依赖出错
此问题如使用 Dependencies 工具,将 SQLite.Interop.dll 文件拖入,则可以看到 mscoree.dll 被打了感叹号
我尝试将一个用户设备上的 mscoree.dll 拖回来分析,使用 dumpbin
工具分析提示无效的格式文件
尝试使用二进制查看工具打开 mscoree.dll 文件
读取到的内容完全不是 PE 文件格式,证明文件完全被损坏
我没有继续了解为什么 mscoree.dll 文件出错了
原文链接: http://blog.lindexi.com/post/SQLite-%E7%94%B1%E4%BA%8E-mscoree.dll-%E6%8D%9F%E5%9D%8F%E5%AF%BC%E8%87%B4-BadImageFormatException-%E8%AF%95%E5%9B%BE%E5%8A%A0%E8%BD%BD%E6%A0%BC%E5%BC%8F%E4%B8%8D%E6%AD%A3%E7%A1%AE%E7%9A%84%E7%A8%8B%E5%BA%8F
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。