从 .NET 4.6.1 应用程序引用 .NET Standard 1.3 库时依赖项不起作用

Dependencies not working when referencing .NET Standard 1.3 library from .NET 4.6.1 app

我的解决方案中有 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": {}
  }
}

库只包含这个简单的 class:

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() 会导致以下异常:

Could not load file or assembly 'Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The system cannot find the file specified.":"Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed"

我的bin文件夹里没有Newtonsoft.Json.dll

我安装了 Visual Studio 2015 Update 3 (KB3165756)(14.0.25431.01,发布于 09/14/2016)以及 .NET Core 1.0.1 VS 2015 Tooling Preview 2。

在谷歌上花了太多时间后,我不确定是否 a) 我做错了什么 b) 工具还不支持这种情况 c) 我的 Visual Studio 安装不知何故被破坏了。

编辑:这里是 complete solution to reproduce

PCL 库项目使用 project.json 文件管理包,但常见的 .NET Framework 项目使用 packages.config.

管理 NuGet 包

我已经测试过,如果我在您的控制台应用程序中手动安装 Newtonsoft.Json 包,它可能 运行 成功。如果我使用 .NET Core 控制台应用程序引用 PCL 库项目,该应用程序还使用 project.json 文件管理 NuGet 包,则该解决方案也可以 运行 成功。

因此在您的情况下,您需要手动将 PCL 库项目中的 NuGet 包安装到您的控制台应用程序中。

您不必手动安装 .NET Standard 库的依赖项。

Microsoft 终于承认这是一个问题,并且 will fix 它有望出现在 NuGet 版本 4.0.1 中,这是 VS 2017 发布后对 NuGet 4 的首次更新。

现在最干净的解决方法是将 <RestoreProjectStyle>PackageReference</RestoreProjectStyle> 添加到遗留项目(在本例中为 .NET 4.6.1.app)项目。但是 according to Rob Relyea MS 将在 RTM 后忽略此 属性,因此另一个解决方法是 <PackageReference Update="PlaceholderToConvinceThisProjectToGetTransitivePackageReferenceFromProjectReferences"/>.

另一种解决方法是像 一样将 .NET Standard 库打包到 NuGet 包中,但这不是最简单的方法。