.NET Framework4.8中LiteDB打开共享连接抛出MissingMethodException
.NET Framework 4.8下LiteDB 5.0.17共享连接模式抛出MissingMethodException的解决办法
问题描述
在.NET Framework 4.8环境中使用LiteDB 5.0.17.0开发,执行以下代码实例化数据库连接时:
Connection = new LiteDatabase("Filename=C:\\temp\\data.ldb;Connection=Shared");
抛出System.MissingMethodException,提示找不到方法Void System.Threading.Mutex..ctor(Boolean, System.String, Boolean ByRef, System.Security.AccessControl.MutexSecurity)。省略Connection=Shared参数时连接正常,且该问题仅在作为应用插件运行时出现,定位到LiteDB的CreateEngine方法中实例化SharedEngine时出错。
原因分析
- .NET Framework 4.8本身包含该Mutex构造函数,但插件运行环境下可能存在程序集绑定冲突:宿主应用可能加载了不同版本的System.Threading相关程序集,导致LiteDB调用的构造函数在当前绑定上下文无法被找到。
- LiteDB的共享模式依赖命名互斥体实现多进程/多实例同步,而部分插件框架的自定义程序集加载策略或权限限制,会阻止LiteDB正常调用该构造函数。
解决/规避方案
1. 添加程序集绑定重定向
在插件的配置文件(或宿主应用的app.config)中添加绑定重定向,确保加载.NET Framework 4.8对应的System.Threading程序集:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Threading" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime>
注:请根据实际环境调整版本号。
2. 手动实现共享访问同步
绕过LiteDB自带的SharedEngine,改用自定义Mutex控制数据库访问时机,连接时使用默认独占模式:
// 全局定义命名互斥体(确保名称唯一,避免冲突) private static Mutex _dbSyncMutex = new Mutex(false, "Global_LiteDB_Data_Lock"); // 数据库操作逻辑 public void ExecuteDbOperation() { _dbSyncMutex.WaitOne(); try { using var db = new LiteDatabase("Filename=C:\\temp\\data.ldb"); // 执行你的数据库读写操作 } finally { _dbSyncMutex.ReleaseMutex(); } }
3. 调整插件加载环境
- 将LiteDB.dll及相关依赖复制到宿主应用的主目录,避免插件加载时找不到正确的程序集版本。
- 检查宿主应用的插件加载策略,配置其允许加载全局程序集缓存(GAC)中的.NET Framework原生程序集。
4. 降级LiteDB版本
如果以上方案均无效,可尝试降级到LiteDB 4.x系列版本,该版本的共享模式实现不依赖引发问题的Mutex构造函数,兼容性更强。
内容的提问来源于stack exchange,提问作者stigzler
相关产品推荐
相关产品推荐

