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 проекта консоли.
Взгляните на мою реализацию в: Обходное решение