将 TypeNameAssemblyFormat 与 PCL 结合使用时,Newtonsoft.Json 出现 MissingMethodException

2023-11-22

将 TypeNameAssemblyFormat 与 PCL 一起使用是否存在问题?除了使用此序列化设置之外,使用 Newtonsoft.Json 的任何其他设置都没有问题。

这是我的Json相关代码:

var settings = new JsonSerializerSettings()
        {
            TypeNameHandling = TypeNameHandling.Objects,
            Formatting = Formatting.Indented,
            TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full
        };

var json = JsonConvert.SerializeObject(obj, settings);

var jsonBytes = Encoding.UTF8.GetBytes(json);

return jsonBytes;

当我在声明它的同一个库中进行调用时,效果很好。但是,当我从调用上述代码的不同 PCL 进行调用时,我收到缺少方法异常。仅当我使用 TypeNameAssemblyFormat 设置时才会发生这种情况(即,如果我不必使用该设置,那么我就不会写这篇文章;)。

我正在使用 PCL 配置文件 7。

例外(我不想重复整个堆栈跟踪,但如果有人认为这会有所帮助,我可以):

"System.MissingMethodException: Method not found: 'Void Newtonsoft.Json.JsonSerializerSettings.set_TypeNameAssemblyFormat(System.Runtime.Serialization.Formatters.FormatterAssemblyStyle)'

尽管问题中没有足够的信息来以 100% 的置信度确认根本原因.. 就我个人而言,经过一些实验后,我是积极认为唯一似是而非的解释如下——

In short- 在失败的测试中,正确的(portable) 的版本Newtonsoft.Json.dll is not正在加载。

In long- 正在进行两项测试。

  1. 通过 - 我假设有一个 exe,它调用 PCL1,它调用portable的版本NewtonSoft.Json.dll

  2. 失败——我认为anotherexe,它调用 PCL2,PCL2 调用 PCL1,PCL1 调用版本 (哪个版本?) of NewtonSoft.Json.dll

问题是notPCL2 调用 PCL1 并因某种原因失败indirect正在拨打电话NewtonSoft.Json.dll。相反,正如我在上面试图强调的那样,问题是second测试恰好以某种方式设置,即错误/不可移植的版本NewtonSoft.Json.dll可供 PCL1 使用。

在失败的情况下,想象一下该应用程序的 exe 或任何其他不可移植程序集也依赖于 (非便携式) 的版本NewtonSoft.Json.dll。在这种情况下,在应用程序/exe的输出文件夹中,将只有一个版本NewtonSoft.Json.dll,如果是非便携式一,那么它将因上述异常而失败..

进一步解释 - 为什么?

方式System.Runtime.Serialization.Formatters.FormatterAssemblyStyle通常定义为mscorlib.dll。但是,此类型不适用于可移植类库使用(不知道所有配置文件,但肯定有一些配置文件没有此类型可用)。因此portable的版本NewtonSoft.Json.dll, 在它自己的程序集中声明它自己.

检查反编译版本portable NewtonSoft.Json.dll在你最喜欢的反编译器中。 请注意下面的第 3 行..以下代码片段来自NewtonSoft.Json.dll.

// Decompiled with JetBrains decompiler
// Type: System.Runtime.Serialization.Formatters.FormatterAssemblyStyle
// Assembly: Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
// Assembly location: C:\Users\.....\packages\Newtonsoft.Json.6.0.7\lib\portable-net40+sl5+wp80+win8+wpa81\Newtonsoft.Json.dll
// Compiler-generated code is shown

namespace System.Runtime.Serialization.Formatters
{
  /// <summary>
  /// Indicates the method that will be used during deserialization for locating and loading assemblies.
  /// 
  /// </summary>
  public enum FormatterAssemblyStyle
  {
    Simple,
    Full,
  }
}

现在,当您在 PCL 中编译代码时,它引用TypeNameAssemblyFormat属性,推测类型System.Runtime.Serialization.Formatters.FormatterAssemblyStyle 定义于 Newtonsoft.Json.dll,生成以下IL(使用反编译Ildasm) -

  IL_0017:  ldloc.0
  IL_0018:  ldc.i4.1
  IL_0019:  callvirt   instance void [Newtonsoft.Json]Newtonsoft.Json.JsonSerializerSettings::set_TypeNameAssemblyFormat(valuetype [Newtonsoft.Json]System.Runtime.Serialization.Formatters.FormatterAssemblyStyle)

请注意如何使用程序集名称来限定对类型的引用[Newtonsoft.Json] (向右滚动----->看到它在FormatterAssemblyStyle传递的参数)。

现在,如果这个便携式版本Newtonsoft.Json.dll,被替换为不可移植版本(因为项目的其他部分引用了不可移植版本),那么在运行时,CLR将无法找到与上述签名匹配的方法(如上面的 IL 所示)..因此失败System.MissingMethodException.

不幸的是,异常本身没有提供有关它正在寻找的方法的完整且准确的签名的足够信息,包括程序集名称.. 单独的类型名称欺骗性地看起来像是系统 dll 之一中存在的东西(mscorlib.dll在这种情况下)..而不是便携式版本Newtonsoft.json.dll.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 TypeNameAssemblyFormat 与 PCL 结合使用时,Newtonsoft.Json 出现 MissingMethodException 的相关文章

  • 将 CSV 复制到 Amazon RDS 托管的 Postgresql 数据库

    我有一个使用 Amazon 的 RDS 服务托管的数据库 我正在尝试编写一个 Web 服务来更新所述数据库 我遇到的问题是它不允许我使用 COPY 命令 因为我收到此错误 错误 必须是超级用户才能复制到文件或从文件复制 我正在使用我为数据库
  • Docker - 如何通过 API 将输入发送到程序

    我一直在使用 Docker 的远程 API 创建一个容器 在其中运行一个 Python 程序 附加到该容器并将写入 stdout 的输出流式传输到网络 现在 我希望我的 Python 程序接受来自 stdin 的用户输入 例如 import
  • 如何在 PowerShell 中将长命令拆分为多行

    如何在 PowerShell 中获取如下所示的命令并将其拆分为多行 C Program Files IIS Microsoft Web Deploy msdeploy exe verb sync source contentPath c w
  • python sklearn中的fit方法

    我问自己关于 sklearn 中拟合方法的各种问题 问题1 当我这样做时 from sklearn decomposition import TruncatedSVD model TruncatedSVD svd 1 model fit X
  • 如何获取所有mysql元组结果并转换为json

    我能够从表中获取单个数据 但是当我试图获取表上的所有数据时 我只得到一行 cnn execute sql rows cnn fetchall column t 0 for t in cnn description for row in ro
  • Mercurial:带参数的别名

    我想创建一个别名 以便在运行时 hg pushbranch lt
  • JavaScript 阶乘防止无穷大

    我一直在 JavaScript 中使用这个函数来计算阶乘数 var f function factorial n if n 0 n 1 return 1 if f n gt 0 return f n return f n factorial
  • 在构建内核模块时为什么需要 /lib/modules? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在Kbuild树中 当我们编写一个简单的hello ko程序时 为什么我们需要在构建规则中使用 C lib module 为什么需要这样做
  • VBA全局类变量

    我的障碍是试图让多个子程序识别类变量 当我尝试全局声明它们时 出现编译错误 无效的外部过程 然后 当我运行公共函数或子函数来声明变量时 它们在其他子函数中保持未定义状态 我希望多个子程序能够识别变量 因为它们的值应该通过用户窗体进行更改 然
  • 使用部分字符串匹配进行 Firebase 查询[重复]

    这个问题在这里已经有答案了 假设我有一个简单的 firebase 实时数据库结构 其中关键是username其值为userid 现在我想搜索userid by username 如果用户名匹配 这很容易 但如何获得部分匹配的答案 更清楚地说
  • SQLite 中的累积求和值

    我正在尝试在 SQLite 中执行值的累积和 我最初只需要对一列求和并获得代码 SELECT t MyColumn SELECT Sum r KeyColumn1 FROM MyTable as r WHERE r Date lt t Da
  • 长/宽数据到宽/长

    我有一个数据框 如下所示 import pandas as pd d decil 1 decil 1 decil 2 decil 2 decil 3 decil 3 decil kommune AA BB AA BB AA BB 2010
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR
  • 如何在控制器中获取f.submit的名称参数?

    我创建了 form html erb 其中的编码如下 是的 我确实有两个相同表单的提交 并且它们都有 更新 和 销毁 等名称 当用户按下销毁按钮时 books controller 中的更新操作将被调用 并判断是 更新 还是 销
  • Wordpress - 通过检查用户状态从外部 bbPress 更改论坛角色

    我想检查用户状态并相应更新他们的 bbPress 论坛角色 不是 WordPress 角色 目的是向 BP Registration Options 插件添加功能 以调节用户注册 在 BuddyPress 中 目前 该插件在用户未经批准时将
  • 没有 Neo4Django 的 Django 和 Neo4j

    我正在使用 Neo4j 以及 Postgres 构建一个 Django 应用程序 我发现这个 Django 集成称为新4django https github com scholrly neo4django 我想知道是否可以只使用neo4r
  • Cycle2 初始化事件未触发

    我使用 Cycle2 作为基本的轮播 我的幻灯片项目有时在其数据中包含一个 url 因此我必须使用 Cycle2 api 事件来使用该 url 当它存在时 我的问题是 虽然 cycle after 事件触发正常 但初始化事件都不会触发 因此
  • 令牌返回后,Google 操作和帐户关联失败

    尝试使用 OAuth2 授权代码流在 Web 模拟器中测试身份验证 https developers google com actions tools web simulator https developers google com ac
  • 缓存 Flask-登录 user_loader

    我有这个 login manager user loader def load user id None return User query get id 在我引入 Flask Principal 之前它运行得很好 identity loa
  • 如何让 webpack 和 iis express 协同工作?

    I have Angular 2 和 Webpack 2 入门 https github com qdouble angular webpack2 starter它通过 webpack dev server 在节点上运行 我如何使用 web

随机推荐