Возможно, NodaTime.Serialization.JsonNet требует ошибки Json.NET v 4.5?

Я нашел старые сообщения, связанные с NodaTime, требующие Json.Net v4.5, но это было исправлено. Кажется, я вижу то же самое с NodaTime.Serialization.JsonNet.

Самый простой способ воспроизвести эту ошибку: добавляя и удаляя NodaTime.Serialization.JsonNet (через NugGet) в проект VS в моем решении, я получаю ошибки привязки/загрузки сборки во время выполнения для Json.Net v4.5 (у меня v 6. х) установлен. Когда я удаляю NodaTime.Serialization.JsonNet, все хорошо.

NodaTime сам по себе в порядке - просто когда я добавляю NodaTime.Serialization.JsonNet, возникает ошибка.

Кто-нибудь еще сталкивался с этой проблемой?

Еще немного информации:

Я еще больше сузил этот вопрос и изолировал проблему таким образом, что она возникает только при вызове метода WCF из среды выполнения PowerShell. NodaTime.Serialization.JsonNet отлично работает только в тестах WCF.

При вызове «ConfigureForNodaTime» ошибка:

Не удалось загрузить файл или сборку «Newtonsoft.Json, версия = 4.5.0.0, культура = нейтральная, PublicKeyToken = 30ad4fe6b2a6aeed» или одну из ее зависимостей. Система не может найти указанный файл.

Я продолжу смотреть на это, но хотел предоставить обновление.

Дополнительная информация:

=== Pre-bind state information ===
LOG: DisplayName = Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
 (Fully-specified)
LOG: Appbase = file:///S:/_Jp/DevProjCommon/__TEST/__TEST/bin/x64/Debug/
LOG: Initial PrivatePath = NULL
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: S:\_Jp\DevProjCommon\__TEST\__TEST\bin\x64\Debug\TestApp.vshost.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
LOG: Attempting download of new URL file:///S:/_Jp/DevProjCommon/__TEST/__TEST/bin/x64/Debug/Newtonsoft.Json.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

app.config (к вашему сведению):

<dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
</dependentAssembly>

Джон, Мэтт:

Когда я открыл исходный код, настройки проекта NodaTime.Serialization.JsonNet ссылаются на «C:\Program Files\Microsoft SDK\Windows Azure.NET SDK\v2.3\ref\Newtonsoft.Json.dll», v4.0.30319, 4.5. .0.0, правда

Возможно, при создании файлов проекта CS разрешается этот путь с учетом следующих настроек:

<ItemGroup Condition="'$(Portability)' == 'Desktop'">
    <Reference Include="Newtonsoft.Json">
      <HintPath>..\..\lib\jsonnet\Net35\Newtonsoft.Json.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup Condition="'$(Portability)' == 'PCL'">
    <Reference Include="Newtonsoft.Json">
      <HintPath>..\..\lib\jsonnet\Portable\Newtonsoft.Json.dll</HintPath>
    </Reference>
  </ItemGroup>

Если я обойду метод расширения «ConfigureForNodaTime» и попытаюсь добавить преобразователи NodaTime в экземпляр сериализатора во вспомогательном методе, возникнет та же ошибка. Так что, говоря конкретно, я не могу пройти мимо добавления преобразователей. Я не могу перейти к вспомогательному методу, который добавляет преобразователи, не сталкиваясь с исключением загрузки сборки.

Я также смог воспроизвести это за пределами PowerShell, в консольном приложении, которое ссылается на мою библиотеку веб-API и сборку сериализации Json.Net.

Я собираюсь добавить исходный код в свой проект (по сравнению с этим тестовым проектом) и перекомпилировать, чтобы посмотреть, решит ли это проблему.

Обновлять:

Когда я загружаю решение «Все» (источник) и пытаюсь собрать, я обнаружил предупреждение ниже. В качестве эксперимента я изменил целевую (.net) платформу на v4.5 с клиента v3.5, и предупреждение исчезло.

Первичная ссылка «Newtonsoft.Json, версия = 4.5.0.0, культура = нейтральная, PublicKeyToken = 30ad4fe6b2a6aeed, processingArchitecture = MSIL» не может быть разрешена, поскольку она косвенно зависит от сборки .NET Framework «System.Runtime.Serialization.Formatters». .Soap, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a», которая имеет более высокую версию «4.0.0.0», чем версия «2.0.0.0» в текущей целевой платформе. NodaTime.Сериализация.JsonNet

Обновление: хотя у меня еще нет дымящегося пистолета, я могу подтвердить, что избавление от проблем с зависимостями Nuget не устранило проблему (это было в моих подозрениях). Пытаясь найти подставки для книг, я добавил в свое решение исходный код для Json.Net и NodaTime, чтобы получить больший контроль.

Успешным обходным решением было изменение целевой платформы в проектах NodaTime на .NET v4.5. v4.0 не работал, v4.5 работал. Это не «исправление» для NodaTime (которое мне действительно нравится, кстати) как таковое, поскольку одна из целей состоит в том, чтобы сделать его доступным для широкого круга приложений, которые могут не использовать последнюю версию .NET framework. Но это (я надеюсь) точка данных, которая может оказаться полезной при диагностике возможных изменений (если это необходимо для других).

Сейчас я испытываю нехватку времени, но я обязуюсь в конечном итоге найти дымящийся пистолет в моем конкретном случае на тот случай, если кто-то еще может столкнуться с ним в будущем.

С уважением, Дж.П.


person ivnext    schedule 22.04.2014    source источник
comment
Трудно точно сказать, что не так, не видя сообщения об ошибке. Для пакета NuGet требуется только Json.NET ›= 4.5.11, поэтому я ожидаю, что он будет работать. Можете ли вы воспроизвести в крошечном консольном приложении?   -  person Jon Skeet    schedule 24.04.2014
comment
Привет, Джон, как дела, сэр!   -  person ivnext    schedule 25.04.2014
comment
Мне не удалось воспроизвести проблему в консольном приложении, по крайней мере, пока. Это довольно сложное приложение (двоичный модуль PowerShell, клиент WCF и т. д.). Я сузил его немного дальше: исключение возникает при выполнении инструкции «ConfigureForNodaTime». Это более конкретно, чем мой первоначальный комментарий. :) Если я закомментирую это утверждение, ошибок не возникнет. Спасибо! -Jp   -  person ivnext    schedule 25.04.2014
comment
Пожалуйста, укажите всю эту информацию в вопросе вместе с точным сообщением об ошибке.   -  person Jon Skeet    schedule 25.04.2014


Ответы (1)


Я могу воспроизвести эту проблему только при нацеливании на .Net 3.5 и использовании Json.Net 6.0.1 или выше. В этом случае вывод сборки сообщает вам о проблеме:

Первичная ссылка «NodaTime.Serialization.JsonNet, версия = 1.2.0.0, культура = нейтральная, PublicKeyToken = 4226afe0d9b296d1, CPUArchitecture = MSIL» не может быть разрешена, поскольку она косвенно зависит от сборки «Newtonsoft.Json, версия = 4.5. 0.0, культура = нейтральная, PublicKeyToken = 30ad4fe6b2a6aeed», который был создан для платформы «.NETFramework, Version = v4.0, Profile = Client». Это более поздняя версия, чем текущая целевая платформа ".NETFramework,Version=v3.5".

NuGet добавляет перенаправление привязки в файл конфигурации, что решает проблему для .Net 4.0 и более поздних версий, но не работает для .Net 3.5.

Поэтому, если вам нужно ориентироваться на .Net 3.5, используйте Json.Net 5.0.8. Если вы можете ориентироваться на .Net 4.0 или новее, вы можете использовать последнюю версию Json.Net.

person Matt Johnson-Pint    schedule 26.04.2014
comment
@JonSkeet - Как вы думаете, есть ли способ обойти это? Я удивлен, что перенаправление привязки не работает в .Net 3.5, но работает в 4.0 или 4.5. - person Matt Johnson-Pint; 26.04.2014
comment
Я еще не совсем уверен, что понимаю это. Проблема в том, что NuGet устанавливает последнюю версию Json.NET, даже если она не подходит для проекта, с которым вы пытаетесь работать? - person Jon Skeet; 26.04.2014
comment
В проекте .net 3.5, если вы просто установите NodaTime.Serialization.JsonNet и позволите nuget сбросить зависимости, он захватит Json.net 4.5.11, и все в порядке. Вы можете полностью обновиться до Json.net 5.0.8, и он все еще работает. Но если вы просто возьмете последнюю версию (6.0.1 или выше), она не сможет скомпилироваться. Я точно не знаю, почему, но я думаю, что решение состоит в том, чтобы создать пакет nuget NodaTime.Serialization.JsonNet с версиями net35-Client и net40-Client, где версия net35 ссылается на версию json.net net35 во время компиляции. - person Matt Johnson-Pint; 27.04.2014
comment
Привет, Джон и Мэтт, извините, я не смог ответить вчера. Я строю с v4.5 (Full). Выходные данные средства просмотра привязки сборки просто показывают (мой) assm как вызывающий assm. Я опубликую больше завтра. - person ivnext; 27.04.2014