SQLite 由于 mscoree.dll 损坏导致 BadImageFormatException 试图加载格式不正确的程序
表现行为是在开发者电脑上能好好运行,在大部分用户设备上能好好运行,只有在个别用户的设备上运行报错
对应的英文错误信息如下
An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
常见的错误堆栈如下
System.BadImageFormatException: 试图加载格式不正确的程序。 (0x8007000B)
in SQLiteErrorCode UnsafeNativeMethods.sqlite3_open_interop(byte[] utf8Filename, byte[] vfsName, SQLiteOpenFlagsEnum flags, int extFuncs, ref IntPtr db)
in void SQLite3.Open(string strFilename, string vfsName, SQLiteConnectionFlags connectionFlags, SQLiteOpenFlagsEnum openFlags, int maxPoolSize, bool usePool)
in void SQLiteConnection.Open()
in void AsyncDbConnection.Open()
in IAsyncDbConnection DataConnection.EnsureConnection(bool connect)
in DbConnection DataConnection.get_Connection()
in int DataConnection.LinqToDB.Common.Internal.IConfigurationID.get_ConfigurationID()
in new Query(IDataContext dataContext, Expression expression)
in new Query<T>(IDataContext dataContext, Expression expression)
in Query<T> Query<T>.CreateQuery(ExpressionTreeOptimizationContext optimizationContext, ParametersContext parametersContext, IDataContext dataContext, Expression expr)
in Query<T> Query<T>.GetQuery(IDataContext dataContext, ref Expression expr, out bool dependsOnParameters)
in Query<T> ExpressionQuery<T>.GetQuery(ref Expression expression, bool cache, out bool dependsOnParameters)
in TResult ExpressionQuery<T>.System.Linq.IQueryProvider.Execute<TResult>(Expression expression)
in TSource Queryable.FirstOrDefault<TSource>(IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
in LocalCoursewareEntry CoursewareSqliteDbReader.GetCoursewareEntry(string localId)+(ITable<LocalCoursewareEntry> tb) => { }
in TReturn CoursewareSqliteDbOperator.ExecuteOnCoursewareTable<TReturn>(Func<ITable<LocalCoursewareEntry>, TReturn> query)+(DataConnection conn) => { }
in TReturn SqliteDbOperator.ExecuteQuery<TReturn>(Func<DataConnection, TReturn> func)
或
System.BadImageFormatException: 试图加载格式不正确的程序。 (0x8007000B)
?, in SQLiteErrorCode UnsafeNativeMethods.sqlite3_config_none(SQLiteConfigOpsEnum op)
?, in bool SQLite3.StaticIsInitialized()
错误原因是 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
工具分析提示无效的格式文件
C:\Program Files\Microsoft Visual Studio\2022\Professional>dumpbin C:\lindexi\Work\mscoree.dll
Microsoft (R) COFF/PE Dumper Version 14.40.33811.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file C:\lindexi\Work\mscoree.dll
C:\lindexi\Work\mscoree.dll : warning LNK4048: 无效的格式文件;已忽略
Summary
尝试使用二进制查看工具打开 mscoree.dll 文件
读取到的内容完全不是 PE 文件格式,证明文件完全被损坏
我没有继续了解为什么 mscoree.dll 文件出错了
博客园博客只做备份,博客发布就不再更新,如果想看最新博客,请访问 https://blog.lindexi.com/
如图片看不见,请在浏览器开启不安全http内容兼容

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名[林德熙](https://www.cnblogs.com/lindexi)(包含链接:https://www.cnblogs.com/lindexi ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我[联系](mailto:lindexi_gd@163.com)。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签
2023-09-05 IIncrementalGenerator 增量 Source Generator 生成代码入门 读取 csproj 项目文件的属性配置
2023-09-05 ASP.NET Core 6 浅析环境变量与配置的优先级
2023-09-05 dotnet 6 在 win7 系统 AES CFB 抛出不支持异常
2023-09-05 IIncrementalGenerator 获取引用程序集的所有类型
2023-09-05 IIncrementalGenerator 判断程序集之间可见关系
2023-09-05 IIncrementalGenerator 增量 Source Generator 生成代码入门 从语法到语义 获取类型完全限定名
2023-09-05 github 解决推拉代码提示 REMOTE HOST IDENTIFICATION HAS CHANGED 失败