Newtonsoft.JSON v9.01 + FileNotFoundException (библиотека .NET Core Class)

(VS2015 Update 3 + Patch)

У меня есть простое консольное приложение .NET(.NET 4.6) и ссылка на базовую библиотеку классов .NET, предназначенную для NetStandard v1.3. Библиотека классов имеет ссылку на Newtonsoft.JSON.

{
  "version": "1.0.0-*",

  "dependencies": {
    "NETStandard.Library": "1.6.0",
    "Newtonsoft.Json": "9.0.1"
  },
  "buildOptions": { "platform": "anycpu" },

  "frameworks": {
    "netstandard1.3": {
      "imports": "dnxcore50"
    }
  }
}

Здесь указан ссылочный пакет NewtonSoft.JSON:

C:\Users\учетная_запись_пользователя \.nuget\пакеты\Newtonsoft.Json\9.0.1

Исключение:

Необработанное исключение типа "System.IO.FileNotFoundException" произошел в DotNetConsoleApplication.exe

Дополнительная информация: Не удалось загрузить файл или сборку 'Newtonsoft.Json, Version = 9.0.0.0, Culture = нейтральный, PublicKeyToken = 30ad4fe6b2a6aeed 'или одна из его зависимостей. система не может найти указанный файл.

Я думаю, что .net core lib ссылается на dll из папки netstandard1.0.

введите описание изображения здесь

Ответ 1

Решено 31.07.2016

Создайте новое простое консольное приложение .NET(не .NET Core) и библиотеку классов .NET Core, не делая никаких ссылок между ними заранее.

Сценарий:
 1. Консольное приложение на основе .NET 4.6, которое ссылается на
 2..Net Core Classlibrary (имеет ссылку на Newtonsoft.JSON v9.01)

Библиотека базового класса .NET сконфигурирована следующим образом (project.json):

{
  "version": "1.0.0-*",

  "dependencies": {
    "NETStandard.Library": "1.6.0",
    "Newtonsoft.Json": "9.0.1"
  },
  "buildOptions": { "platform": "anycpu" },

  "frameworks": {
    "netstandard1.3": {
      "imports": "dnxcore50"
    }
  }
}

Решение

1.) Сначала создайте пакет Nuget из проекта библиотеки классов .Net.

Откройте командную строку в качестве администратора. Перейти (cd) в папку проекта проекта .NET core class library (.xproj).

Выполните следующую команду:

dotnet pack

введите описание изображения здесь

Параметр "pack" создаст пакет nuget из библиотеки классов .NET Core и скопирует пакет в папку debug/release, в зависимости от конфигурации вашего проекта.

Скопируйте файлы пакета nuget в папку , где размещены локальные пакеты nuget. Я скопировал их:

C:\Users\Admin.nuget\пакеты\LocalPackages\NetCore46ClassLibrary


Скриншот: введите описание изображения здесь
2.) Если у вас нет локального фида Nuget, вы должны сначала создать его!

Локальная папка Nuget (я называю ее "LocalPackages" ) будет размещать ваши собственные пакеты Nuget. Локальный Nuget Feed будет указывать на "LocalPackages", который является корневой папкой для всех локальных пакетов.

введите описание изображения здесь

После того, как вы создали локальный канал nuget и скопировали пакет nuget вашей библиотеки классов ядра .net где-то под папкой localPackages, вы готовы установить пакет nuget для библиотеки классов .net.

3.) Установите пакет Nuget для платформы .NET Core в консольное приложение .NET.

вам нужно снова открыть консоль диспетчера пакетов. Выберите "Источник пакета: локальные пакеты" (это имя моего локального фида, может отличаться). Проект по умолчанию должен быть вашим консольным приложением .NET.

введите описание изображения здесь

Установите пакет nuget библиотеки классов .net в консольное приложение, в моем случае:

install-package NetCore46ClassLibrary

Что это!

Моя система:
введите описание изображения здесь

dotnet --version
1.0.0-preview2-003121

Ответ 2

Создание пакета NuGet является решением, но не самым простым.

Microsoft наконец признала, что это проблема, и исправит ее , предположительно, в версии NuGet 4.0.1, первое обновление для NuGet 4 после того, как корабль VS 2017 отправляется.

Самый чистый обходной путь теперь заключается в добавлении <RestoreProjectStyle>PackageReference</RestoreProjectStyle> к устаревшему проекту. Однако в соответствии с Rob Relyea MS проигнорирует это свойство после RTM, поэтому другой способ обхода <PackageReference Update="PlaceholderToConvinceThisProjectToGetTransitivePackageReferenceFromProjectReferences"/>.

Ответ 3

Может быть, сборка Newtonsoft - 64 бит, а ваш .Net Core - 32 бит. Также может быть, что у вас есть несколько версий ссылки Newtonsoft.

Ответ 4

У меня была такая же ошибка в последнее время, после включения Newtonsoft.Json 6.0.8 в консольное приложение dotnet. Решение заключалось в том, чтобы включить зависимость System.Runtime.Serialization.Pimitives к конфигурации project.json.

{
  "version": "1.0.0-*",
  "buildOptions": {
    "debugType": "portable",
    "emitEntryPoint": true
  },
  "dependencies": {
    "System.Runtime.Serialization.Primitives":  "4.0.10-*",
    "Newtonsoft.Json": "6.0.8"
  },
  "frameworks": {
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.0.0"
        }
      },
      "imports": "dnxcore50"
    }
  }
}

Ответ 5

В качестве обходного решения. В visual studio 2017 вы можете изменить проект NetStandard.csproj как многоцелевую:

           <TargetFrameworks>netstandard1.3;net461</TargetFrameworks>

Восстановите решение, и ссылка dll (NewtonSoft.JSON) будет скопирована в папку bin проекта консоли.

Взгляните на мою реализацию в: Обходное решение