为啥我们在升级到 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中删除