代码之家  ›  专栏  ›  技术社区  ›  nforss

如何使用NewtonSoft进行主项目。Json与使用Json的子项目。网Unity3D?

  •  0
  • nforss  · 技术社区  · 5 年前

    我有一个在Unity3D项目中使用的类库,它使用Json序列化/反序列化。自从官方的NewtonSoft。Json NuGet与Unity不能很好地协同工作,我使用的是Json。网Unity3D(9.0.0.0版),迄今为止一直运行良好。

    现在我正在建立另一个项目,其中一个主要组件依赖于NewtonSoft。Json(11.0.0.0节)。这个新项目还需要引用前面提到的类库。这个编译没有问题,但是当类库试图使用Json函数时,它找不到所需的Json库,我得到了一个错误。

    System.IO.FileLoadException: Could not load file or assembly 'Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
    File name: 'Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' ---> System.IO.FileLoadException: Could not load file or assembly 'Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
    File name: 'Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'
    

    由于两个Json库版本具有不同的PublicKeyToken,绑定重定向将无法工作。我一直试图找到这个问题的解决方案,但没有成功,但需要一些投入。以下是我提出的可能选项:

    1. 防止主项目的Json库传播到 不知怎的引用了这个项目。如果我运行的测试版本 project根本没有Json库,子项目可以工作 好的
    2. 破解绑定重定向以接受不同版本的不同dll:s。似乎不可能。
    3. 在主项目中安装两个版本,并在适当的情况下使用。似乎也不是第一个。

    任何见解都将不胜感激——我已经在这个问题上浪费了太多时间。

    Here's a small test solution that demonstrates the problem

    2 回复  |  直到 5 年前
        1
  •  0
  •   Miq    5 年前

    我不确定这是否有效,但您可以尝试通过nuget包引用v9,并从dll文件手动引用v11,该文件将“始终复制”到输出目录,并且它应该具有不同的文件名。这样,输出程序集应该加载两个json DLL——v9和v11。

        2
  •  0
  •   nforss    5 年前

    我最终决定,如果工作量合理,这是不可能的,所以我采取了另一种方法。我创建了一个界面,提供了与NewtonSoft相同的方法。我的库使用的Json(即JsonConvert.Serialize和Deserialize),然后在引用库的每个项目中制作一个实现所述接口的包装器。这使我能够完全删除对NewtonSoft的任何引用。Json,而且每个项目只需要少量的重复代码。