SQLite 由於 mscoree.dll 損壞導致 BadImageFormatException 試圖載入格式不正確的程式

lindexi發表於2024-09-05

本文記錄 SQLite.Interop.dll 由於 mscoree.dll 檔案損壞而在載入時丟擲 BadImageFormatException 錯誤,錯誤資訊是 0x8007000B 試圖載入格式不正確的程式

對應的英文錯誤資訊如下

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 檔案出錯了

相關文章