.NET Framework 4.6.1中Npgsql 4.1.14的DisposeAsync未实现异常求助
.NET Framework 4.6.1下Npgsql
DisposeAsync未实现异常解决方案 问题重现
打开NpgsqlConnection时抛出如下异常:
Method 'DisposeAsync' in type 'Npgsql.NpgsqlBinaryExporter' from assembly 'Npgsql, Version=4.1.14.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7' does not have an implementation.
异常触发代码片段:
public static DataTable FetchMasterData() { NpgsqlConnection npgsqlConn = new NpgsqlConnection(Connection.ConnectionStringPostgreSQL); DataTable classMasterTbl = new DataTable(); string sqlQuery = string.Empty; NpgsqlCommand npgsqlCommand = null; try { sqlQuery = @"SELECT * FROM ClassMaster"; npgsqlCommand = new NpgsqlCommand(sqlQuery, npgsqlConn); npgsqlConn.Open(); // 此处报错 NpgsqlDataAdapter dataAdapter = new NpgsqlDataAdapter(npgsqlCommand); dataAdapter.Fill(classMasterTbl); return classMasterTbl; } catch (Exception dalExce) { // 已处理LoaderExceptions } finally { npgsqlCommand?.Dispose(); npgsqlConn.Close(); } }
项目环境:目标框架.NET Framework 4.6.1,Npgsql版本4.1.14.0。
问题解答
1. 是否存在完全兼容.NET Framework 4.6.1且无需DisposeAsync的Npgsql版本?
存在。Npgsql 4.0.x系列是最后一批完全适配.NET Framework 4.6.1、未引入IAsyncDisposable/DisposeAsync相关API的稳定版本。4.1.x版本开始引入异步释放接口,但对.NET Framework 4.6.1的兼容处理存在缺陷,导致运行时抛出未实现方法的异常。
2. 不升级.NET Framework的情况下,解决问题的推荐方案是什么?
优先采用降级Npgsql版本的方案,步骤如下:
- 卸载当前的Npgsql 4.1.14及相关异步兼容包(如
Microsoft.Bcl.AsyncInterfaces) - 安装Npgsql 4.0.15(4.0系列的最后一个稳定版,完全适配.NET Framework 4.6.1)
- 清理项目的
packages.config和.csproj文件,确保所有Npgsql相关引用都指向4.0.15版本
若必须使用4.1.x版本,可尝试以下修复:
- 将
Microsoft.Bcl.AsyncInterfaces版本升级至1.1.1及以上,该版本修复了部分.NET Framework下的异步接口兼容问题 - 在
app.config中手动添加程序集绑定重定向,确保版本统一:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.1.0" /> </dependentAssembly> </assemblyBinding> </runtime>
代码优化建议
可使用using语句自动管理资源,替代手动调用Dispose和Close,减少资源泄漏风险:
public static DataTable FetchMasterData() { using (var npgsqlConn = new NpgsqlConnection(Connection.ConnectionStringPostgreSQL)) using (var npgsqlCommand = new NpgsqlCommand(@"SELECT * FROM ClassMaster", npgsqlConn)) { npgsqlConn.Open(); var classMasterTbl = new DataTable(); using (var dataAdapter = new NpgsqlDataAdapter(npgsqlCommand)) { dataAdapter.Fill(classMasterTbl); } return classMasterTbl; } }
内容的提问来源于stack exchange,提问作者PPB
相关产品推荐
相关产品推荐

