Как сделать основной проект, использующий NewtonSoft.Json, с подпроектом, использующим Json.Net.Unity3D? - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть ситуация, когда у меня есть библиотека классов, используемая в проекте Unity3D и использующая сериализацию / десериализацию Json.Поскольку официальный NewtonSoft.Json NuGet не работает вместе с Unity, я использую Json.Net.Unity3D (v. 9.0.0.0), который до сих пор работал нормально.

Теперь янастройка другого проекта, в котором один из основных компонентов зависит от NewtonSoft.Json (v. 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 имеют разные PublicKeyTokens, перенаправление привязки не будет работать.Я безуспешно пытался найти решение этой проблемы, но мне понадобится немного информации.Вот возможные варианты, которые я предложил:

  1. Предотвращение распространения библиотеки Json основного проекта в ссылочный проект.Если я запускаю тестовую версию, в которой основной проект вообще не имеет библиотеки Json, подпроект работает нормально.
  2. Взлом перенаправления привязки для принятия разных dll: s для разных версий.Кажется невозможным.
  3. Наличие обеих версий, установленных в основном проекте и используемых там, где это необходимо.Также кажется, что это не стартер.

Любое понимание будет высоко оценено - я уже потратил слишком много времени на эту проблему.

Вот небольшой тестрешение, которое демонстрирует проблему

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Я решил, что это невозможно с разумным количеством работы, поэтому я выбрал другой подход.Я создал интерфейс, предоставляющий те же методы из NewtonSoft.Json, которые использовались моей библиотекой (то есть JsonConvert.Serialize и Deserialize), а затем создал оболочку, реализующую указанный интерфейс в каждом проекте, ссылающемся на библиотеку.Это позволило мне полностью удалить любые ссылки на NewtonSoft.Json из библиотеки, и в каждом проекте требовалось лишь небольшое количество дублированного кода.

0 голосов
/ 31 декабря 2018

Я не уверен, что это сработает, но вы можете попробовать сделать ссылку v9 через пакет nuget, а ссылку v11 - вручную из файла dll, который будет «всегда копировать» в выходной каталог, плюс он должен иметь другой файлназвание.Таким образом, выходная сборка должна загрузить две библиотеки json - v9 и v11.

...