Зависимости не работают при ссылке на библиотеку .NET Standard 1.3 из приложения .NET 4.6.1

У меня есть 2 проекта в моем решении. Во-первых, это переносимая библиотека, ориентированная на .NET Standard 1.3. Эта библиотека зависит от Json.NET. Его project.json выглядит следующим образом:

{
  "supports": {},
  "dependencies": {
    "Microsoft.NETCore.Portable.Compatibility": "1.0.1",
    "NETStandard.Library": "1.6.0",
    "Newtonsoft.Json": "9.0.1"
  },
  "frameworks": {
    "netstandard1.3": {}
  }
}

Библиотека состоит всего из этого простого класса:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestLibrary
{
    public class TestClass
    {
        public static string Foo() {
            return JsonConvert.SerializeObject(42);
        }
    }
}

Второй проект — это консольное приложение, ориентированное на полную платформу .NET 4.6.1. Это консольное приложение ссылается на упомянутую выше библиотеку. Код следующий:

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var x = TestLibrary.TestClass.Foo();
        }
    }
}

Я могу собрать и запустить его, но вызов TestLibrary.TestClass.Foo() приводит к следующему исключению:

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

В моей папке bin нет Newtonsoft.Json.dll.

У меня установлено Visual Studio 2015 Update 3 (KB3165756) (14.0.25431.01, выпущено 14.09.2016), а также .NET Core 1.0.1 VS 2015 Tooling Preview 2.

Потратив слишком много времени на гугление, я не уверен, что а) я делаю что-то не так б) инструменты еще не поддерживают этот сценарий в) моя установка Visual Studio каким-то образом не работает.

РЕДАКТИРОВАТЬ: Вот полное решение для воспроизведения.


person Stalker    schedule 04.10.2016    source источник
comment
Являются ли приложения ClassLibrary и Console приложением .NET Core? Я создаю как .NET Core ClassLibrary, так и консольное приложение на основе вашего описания, но не получаю никаких сообщений об ошибках. Если возможно, я предлагаю вам предоставить пример проекта, я запущу ваше приложение на своей стороне, чтобы подтвердить, есть ли какие-либо проблемы в вашем проекте или установке VS.   -  person Weiwei    schedule 05.10.2016
comment
Нет, это не .NET Core. Библиотека — это PCL, ориентированная на .NET Standard 1.3, а консольное приложение — на полную платформу .NET 4.6.1. Пример проекта можно найти здесь (сейчас нельзя использовать GitHub).   -  person Stalker    schedule 05.10.2016


Ответы (2)


Проект библиотеки PCL управляет пакетами с помощью файла project.json, но общие проекты .NET Framework управляют пакетами NuGet с помощью packages.config.

Я проверил, если я установлю пакет Newtonsoft.Json в вашем консольном приложении вручную, он может работать успешно. И если я сошлюсь на проект библиотеки PCL с помощью приложения .NET Core Console, которое также управляет пакетами NuGet с файлом project.json, решение также может работать успешно.

Таким образом, в вашей ситуации вам необходимо вручную установить пакеты NuGet, которые находятся в проекте библиотеки PCL, в ваше консольное приложение.

person Weiwei    schedule 06.10.2016
comment
Да, когда я устанавливаю зависимости для консольного приложения, это работает. И да, я подозревал, что это как-то связано с различиями в project.json/packages.config. Но остается главный вопрос: этот сценарий не поддерживается инструментами? Будет ли это исправлено в будущем? Я не могу найти ответ на этот вопрос (может быть, я просто плохо разбираюсь в этом). Потому что мой реальный сценарий намного сложнее, и меня раздражает, когда мне приходится дублировать зависимости во всех проектах, ссылающихся на проект стандартной библиотеки. В любом случае, я приму ваш ответ, так как он решает проблему. - person Stalker; 07.10.2016
comment
Я также не нахожу никаких новостей о том, поддерживается ли этот сценарий или нет. Согласно документу NuGet, в нем упоминается, что для получения дополнительной информации см. Часто задаваемые вопросы о Кодексе поведения или обращайтесь по адресу [email protected] с любыми дополнительными вопросами или комментариями. Поэтому я предлагаю вам связаться с [email protected], чтобы сообщить об этой проблеме. - person Weiwei; 10.10.2016
comment
Принятый ответ устарел, поскольку project.json больше не используется для стандарта .net. Сейчас они используют .csproj. - person trampster; 15.03.2017

Вам не нужно вручную устанавливать зависимости библиотек .NET Standard.

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

Теперь самым простым обходным путем является добавление <RestoreProjectStyle>PackageReference</RestoreProjectStyle> в устаревший проект (в данном случае приложение .NET 4.6.1.). Однако по словам Роба Рельеа MS будет игнорировать это свойство после RTM, поэтому другое обходной путь — <PackageReference Update="PlaceholderToConvinceThisProjectToGetTransitivePackageReferenceFromProjectReferences"/>.

Другой обходной путь — упаковать стандартную библиотеку .NET в пакет NuGet, как в этом ответе, но это не самый простой способ.

person Sourcerer    schedule 10.02.2017