【问题标题】:Npgsql package gives System.TypeInitializationExceptionNpgsql 包给出 System.TypeInitializationException
【发布时间】:2020-07-02 13:14:04
【问题描述】:

简单的愚蠢错误,但我在互联网上找不到任何解决方案。 我在使用 NuGet PackageReference 的简单项目 .NETFramework v4.6.1 时遇到错误。 我是否忘记了具体的参考资料?

测试方法中的简单代码:

var host = "localhost";
var port = 5432
var database = "postgres";
var username = "postgres";
var password = "password";
var connectionString = $"Host={host};Port={port};Database={database};Username={username};Password={password};";
var connection = new NpgsqlConnection(connectionString);
try
{
    connection.Open();
}
catch (Exception ex)
{
    var rtle = ex.InnerException as ReflectionTypeLoadException;
    var exceptions = rtle.LoaderExceptions;
    //  ^^^^^^^^^^
    // System.TypeLoadException: The 'DisposeAsync' method of type 'Npgsql.NpgsqlBinaryExporter' of assembly 'Npgsql, Version=4.1.3.1, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7' has no implementation.
}

project.csproj中的所有PackageReference:

<PackageReference Include="Npgsql" Version="4.1.3.1" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.abstractions" Version="2.0.0" />
<PackageReference Include="xunit.assert" Version="2.1.0" />
<PackageReference Include="xunit.core" Version="2.1.0" />
<PackageReference Include="xunit.extensibility.core" Version="2.1.0" />
<PackageReference Include="xunit.extensibility.execution" Version="2.1.0" />

例外:

System.TypeInitializationException: Une exception a été levée par l'initialiseur de type pour 'Npgsql.TypeMapping.GlobalTypeMapper'. ---> System.Reflection.ReflectionTypeLoadException: Impossible de charger un ou plusieurs des types requis. Extrayez la propriété LoaderExceptions pour plus d'informations.
   à System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
   à System.Reflection.RuntimeModule.GetTypes()
   à System.Reflection.Assembly.GetTypes()
   à Npgsql.TypeMapping.GlobalTypeMapper.SetupGlobalTypeMapper() dans C:\projects\npgsql\src\Npgsql\TypeMapping\GlobalTypeMapper.cs:ligne 161
   à Npgsql.TypeMapping.GlobalTypeMapper..cctor() dans C:\projects\npgsql\src\Npgsql\TypeMapping\GlobalTypeMapper.cs:ligne 32
   --- Fin de la trace de la pile d'exception interne ---
   à Npgsql.TypeMapping.GlobalTypeMapper.get_Instance()
   à Npgsql.TypeMapping.ConnectorTypeMapper..ctor(NpgsqlConnector connector) dans C:\projects\npgsql\src\Npgsql\TypeMapping\ConnectorTypeMapper.cs:ligne 60
   à Npgsql.NpgsqlConnector.<LoadDatabaseInfo>d__149.MoveNext() dans C:\projects\npgsql\src\Npgsql\NpgsqlConnector.cs:ligne 431
--- Fin de la trace de la pile à partir de l'emplacement précédent au niveau duquel l'exception a été levée ---
   à System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   à System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   à System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   à Npgsql.NpgsqlConnector.<Open>d__148.MoveNext() dans C:\projects\npgsql\src\Npgsql\NpgsqlConnector.cs:ligne 423
--- Fin de la trace de la pile à partir de l'emplacement précédent au niveau duquel l'exception a été levée ---
   à System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   à System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   à System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   à Npgsql.ConnectorPool.<AllocateLong>d__28.MoveNext() dans C:\projects\npgsql\src\Npgsql\ConnectorPool.cs:ligne 249
--- Fin de la trace de la pile à partir de l'emplacement précédent au niveau duquel l'exception a été levée ---
   à System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   à System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   à System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   à System.Threading.Tasks.ValueTask`1.get_Result()
   à System.Runtime.CompilerServices.ValueTaskAwaiter`1.GetResult()
   à Npgsql.NpgsqlConnection.<>c__DisplayClass32_0.<<Open>g__OpenLong|0>d.MoveNext() dans C:\projects\npgsql\src\Npgsql\NpgsqlConnection.cs:ligne 297
--- Fin de la trace de la pile à partir de l'emplacement précédent au niveau duquel l'exception a été levée ---
   à System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   à System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   à System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   à Npgsql.NpgsqlConnection.Open() dans C:\projects\npgsql\src\Npgsql\NpgsqlConnection.cs:ligne 119
   à Postgresql.Tests.Queries.Test() dans C:\Git\Postgresql.Tests\Queries.cs:ligne 20

【问题讨论】:

  • 捕获异常;内部异常(.InnerException)听起来像是ReflectionTypeLoadException,所以:看看那个:var rtle = ex.InnerException as ReflectionTypeLoadException; - 然后看看加载程序异常:if (rtle is object) { ... look at rtle.LoaderExceptions ...} - 看看他们怎么说;我的猜测是缺少程序集绑定重定向
  • 程序集 'Npgsql, Version=4.1.3.1, Culture=neutral, 'PublicKeyToken=5d8b90d52f46fda7' 的 'Npgsql.NpgsqlBinaryExporter' 类型的 'DisposeAsync' 方法没有实现。发现于 ex.InnerException.LoaderExceptions
  • 好的,听起来像是要通过 github.com/npgsql/npgsql/issues 与 Shay Rojansky(“roji”)一起记录的东西

标签: c# .net npgsql c#-8.0


【解决方案1】:

看起来这是一个打包错误,已在代码中修复,但尚未部署;您可能可以通过向本地项目添加包引用来临时解决此问题:

<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="1.1.1" />

(然后清理解决方案 - 特别是确保在重建之前删除 /obj 和 /bin 等)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 2017-02-05
  • 1970-01-01
相关资源
最近更新 更多