为啥我们在升级到 Core 2.1 和 Framework 4.7.2 后在 ServiceStack 中收到 TypeIntializer 异常?

Posted

技术标签:

【中文标题】为啥我们在升级到 Core 2.1 和 Framework 4.7.2 后在 ServiceStack 中收到 TypeIntializer 异常?【英文标题】:Why are we receiving TypeIntializer Exception in ServiceStack after upgrading to Core 2.1 and Framework 4.7.2?为什么我们在升级到 Core 2.1 和 Framework 4.7.2 后在 ServiceStack 中收到 TypeIntializer 异常? 【发布时间】:2018-10-03 22:34:00 【问题描述】:

我们有一个包含多个项目的 Visual Studio C# 解决方案,包括 .NET Standard 类库、.NET Framework 应用程序(因为它们使用在 Framework 上编写的第 3 方引用)和 .NET Core 应用程序。

以前使用的这些项目:

.NET 标准 2.0 .NET Core 2.0 .NET 框架 4.6.1 ServiceStack 5.1.0

我们不得不做一些有点奇怪的事情。我们有托管 ServiceStack 服务的 .NET Core 应用程序,我们有作为 ServiceStack 客户端的 .NET Framework 应用程序,并且这两个应用程序都引用了一个包含 ServiceStack 请求对象的 .NET Standard 类库。不幸的是,ServiceStack 模块的 Framework 和 Core 版本不兼容,尤其是在 Interfaces 组件中。因此,Framework 应用程序必须引用 ServiceStack.*.Core DLL(mythz 告诉我们并解决了问题)。

现在我们已经将我们的代码升级到了

.NET 标准 2.0 .NET Core 2.2 .NET Framework 4.7.2 ServiceStack 5.4.0

代码编译得很好,但是当我们运行它时,我们无法在框架应用程序中实例化 JsonServiceClient。

  using (var client = new JsonServiceClient(_config.PropagationUrl))
  
     ...
  

上述代码的第一行抛出如下异常:

System.TypeInitializationException H结果=0x80131534 Message='ServiceStack.ServiceClientBase' 的类型初始化程序引发了异常。 源=ServiceStack.Client 堆栈跟踪: 在 ServiceStack.ServiceClientBase..ctor() 在 ServiceStack.JsonServiceClient..ctor(String baseUri) 在 C:\Work\TMobile\stitch\src\Stitch.Logic\Coverage\Actors\ExtentsActor.cs:line 75 中的 Stitch.Logic.Coverage.ExtentsActor.PostCellExtentRequest(CellExtentsRequest 请求)处

内部异常 1: TypeInitializationException:“ServiceStack.Text.Env”的类型初始化程序引发了异常。

内部异常 2: FileNotFoundException:无法加载文件或程序集 'System.Runtime.InteropServices.RuntimeInformation,Version=4.0.2.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。系统找不到指定的文件。

内部异常 3: FileNotFoundException:无法加载文件或程序集“System.Runtime.InteropServices.RuntimeInformation,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。系统找不到指定的文件。

谁能告诉我为什么,更重要的是,如何解决这个问题?

【问题讨论】:

检查您的绑定。如果您没有看到问题,请发布它们。还要验证您使用的是适当版本的 JSON。事实上,专注于您的 JSON 绑定。 【参考方案1】:

这是一个绑定问题,先试试adding or removing the Assembly binding information for System.Runtime.InteropServices.RuntimeInformation:

<dependentAssembly>
  <assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>

如果不能解决,请尝试删除所有 ServiceStack NuGet 包和程序集绑定,删除 /packages/bin/obj 文件夹并再次添加 ServiceStack NuGet 包。

【讨论】:

是的,解决了它。我必须删除 System.Runtime.InteropServices.RuntimeInformation 和 System.Runtime 的dependentAssembly 引用。这是因为我让 NuGet 将我的应用程序升级到两者的最新版本 (4.0.2.0),两个 ServiceStack 仍在引用旧版本 (4.0.0.0)? @PhoeniceusAgelaius NuGet 尝试在您安装/升级软件包时自动生成它认为需要的绑定重定向,但有时会出错。

以上是关于为啥我们在升级到 Core 2.1 和 Framework 4.7.2 后在 ServiceStack 中收到 TypeIntializer 异常?的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助对 linux Docker 中的 .NET Core 2.1 API 进行故障排除

强制升级?!.NET Core 2.1容器镜像将从Docker Hub中删除

Blog.Core开源快速升级.NET 6.0

.net core电商平台升级之微服务架构应用实战

在部署到IIS应用程序时升级FSharp.Core版本,程序集引用错误

SQL Server Compact 4.0 和 Sync Framework 2.1:为啥缺乏支持?