【问题标题】:Dependencies not working when referencing .NET Standard 1.3 library from .NET 4.6.1 app从 .NET 4.6.1 应用程序引用 .NET Standard 1.3 库时,依赖项不起作用
【发布时间】:2017-02-12 17:41:17
【问题描述】:

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

【问题讨论】:

  • ClassLibrary 和 Console 应用程序都是 .NET Core 应用程序吗?我根据您的描述创建了 .NET Core ClassLibrary 和 Console 应用程序,但没有收到任何错误消息。如果可能的话,我建议你提供一个示例项目,我会在我这边运行你的应用程序,以确认你的项目或 VS 安装是否有问题。
  • 不,它们不是 .NET Core。库是针对 .NET Standard 1.3 的 PCL,控制台应用程序针对的是完整的 .NET 4.6.1 框架。您可以找到示例项目here(目前无法使用 GitHub)。

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


【解决方案1】:

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

Microsoft 终于承认这是一个问题,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 Standard 库打包到 NuGet 包中,例如 that answer,但这不是最简单的方法。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,当我将依赖项安装到控制台应用程序时,它可以工作。是的,我怀疑它与 project.json/packages.config 差异有关。但主要问题仍然存在:工具不支持这种情况吗?将来会修复吗?我找不到答案(也许我只是不擅长谷歌搜索)。因为我的现实世界场景要复杂得多,当我必须在所有引用标准库项目的项目中复制依赖项时,这很烦人。无论如何,我会接受你的回答,因为它解决了问题。
    • 我也没有找到任何关于此场景是否不受支持的消息。根据 NuGet 的文件,它提到“有关更多信息,请参阅行为准则常见问题解答或联系 opencode@microsoft.com 有任何其他问题或 cmets”。所以我建议你联系 opencode@microsoft.com 提交这个问题。
    • 接受的答案已过时,因为 project.json 不再用于 .net 标准。他们现在使用 .csproj。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2018-11-04
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多