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

时间:2016-10-04 13:58:58

标签: .net visual-studio-2015 nuget .net-standard

我的解决方案中有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,Version = 9.0.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed”或其中一个依赖项。系统找不到指定的文件。“:”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,于2016年9月14日发布)以及.NET Core 1.0.1 VS 2015 Tooling Preview 2.

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

编辑:这是complete solution to reproduce

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

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

微软最终承认这是一个问题,而且will fix预计会在NuGet 4.0.1版本中出现,这是VS 2017发布后对NuGet 4的第一次更新。

现在最简洁的解决方法是将<RestoreProjectStyle>PackageReference</RestoreProjectStyle>添加到旧版本(在本例中为.NET 4.6.1。应用程序)项目中。但是according to Rob Relyea MS会在RTM之后忽略此属性,因此另一种解决方法是<PackageReference Update="PlaceholderToConvinceThisProjectToGetTransitivePackageReferenceFromProjectReferences"/>

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