【问题标题】:The imported type `Newtonsoft.Json.Linq.JObject' is defined multiple times多次定义导入的类型`Newtonsoft.Json.Linq.JObject'
【发布时间】:2019-03-05 09:34:42
【问题描述】:

这个问题是 Unity 特有的,这个问题以前曾被问过,但不是专门为 Unity 提出的。

我有 2 个第三方包,它们各自的插件目录中有 2 个 dll:fastjson.dll 和 newtonsoft.json.dll

我收到以下错误:

导入的类型Newtonsoft.Json.Linq.JObject' is defined multiple times The imported typeNewtonsoft.Json.JsonSerializerSettings'被定义了多次

原因很明显,这两个类都定义在两个 dll 中。我试图删除其中一个 dll 来解决问题,但由于包的插件目录中还有其他 dll 依赖于这两个 dll,所以当我运行场景时,我得到一个未找到文件的异常。

没有让包创建者做点什么,我可以做些什么来解决?

【问题讨论】:

  • 您是否尝试过使用外部别名并为类型使用完全限定名称?你可以参考如何做到这一点here
  • 您标记为可能重复的问题不是 Unity 特有的。我的问题以及下面提供的正确答案是针对 Unity 的。

标签: c# unity3d


【解决方案1】:

您可以使用外部别名绕过冲突。以下是如何执行此操作。

在您的Assets 文件夹中创建一个文件mcs.rsp。写这样的东西:

-reference:Newtonsoft=Assets/Plugins/newtonsoft.json.dll

编辑路径,使其尊重您的项目架构。 (如果您愿意,可以使用 fastjon.dll)

更多关于mcs.rsphttps://docs.unity3d.com/Manual/PlatformDependentCompilation.html

然后,在罪魁祸首 .cs 文件中,添加以下内容:

extern alias Newtonsoft;

using UnityEngine;
using JObject = Newtonsoft::Newtonsoft.Json.Linq.JObject;

// ...

另一种解决方案是反编译(最近的 IDE,如 Rider/MVS 可以为您完成)并重建自己的托管 DLL 并重命名命名空间。您可能必须使用修改后的 DLL 修改所有脚本。

以下是为 Unity 创建 DLL 的一些指南(不要忘记使用 -sdk:2.0 选项进行编译,本文档中未指定,但您的 dll 需要使用 Unity):https://docs.unity3d.com/Manual/UsingDLL.html

顺便说一下,向插件维护者发送请求,警告他们命名空间冲突。

【讨论】:

  • 太棒了,我会试试这个。我不知道这个解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 2020-07-16
  • 2020-11-15
  • 2021-05-15
相关资源
最近更新 更多