【问题标题】:Newtonsoft.JSON v9.01 + FileNotFoundException (.NET Core Class library)Newtonsoft.JSON v9.01 + FileNotFoundException(.NET Core 类库)
【发布时间】:2017-07-07 23:54:59
【问题描述】:

(VS2015 更新 3 + 补丁)

我有一个普通的 .NET 控制台应用程序 (.NET 4.6) 并引用了一个面向 NetStandard v1.3 的 .NET 核心类库。 类库有对 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\UserAccount\.nuget\packages\Newtonsoft.Json\9.0.1

例外:

“System.IO.FileNotFoundException”类型的未处理异常 发生在 DotNetConsoleApplication.exe 中

附加信息:无法加载文件或程序集 'Newtonsoft.Json,版本=9.0.0.0,文化=中性, PublicKeyToken=30ad4fe6b2a6aeed' 或其依赖项之一。这 系统找不到指定的文件。

我猜 .net 核心库会引用 netstandard1.0 文件夹中的 dll。

【问题讨论】:

  • 你到底是如何引用那个类库的?
  • 添加参考-> 我浏览到 NetStandardv1.3 文件夹:C:\Users\UserAccount\Documents\Visual Studio 2015\Projects\ASP.NETcoreApp\NetCore46ClassLibrary\bin\Debug\netstandard1.3\NetCore46ClassLibrary.dll
  • @Legends 我也遇到了同样的问题,你找到解决方法了吗?
  • @nboisvert,不,我没有进一步探索它。在我的情况下,它只有在我将 newtonsoft.json 引用添加到引用 .net 核心类库的父项目时才有效,同时我在核心库中删除了对 newtonsoft.json 的引用。然后就跑了,不过这样很丑,不推荐!

标签: c# json.net .net-core


【解决方案1】:

创建 NuGet 包是一种解决方案,但不是最简单的。

Microsoft 终于承认这是一个问题,will fix 期待在 NuGet 版本 4.0.1 中,这是 VS 2017 发布后 NuGet 4 的第一次更新。

现在最简洁的解决方法是将<RestoreProjectStyle>PackageReference</RestoreProjectStyle> 添加到旧项目中。但是according to Rob Relyea MS 将在 RTM 之后忽略此属性,因此另一种解决方法是<PackageReference Update="PlaceholderToConvinceThisProjectToGetTransitivePackageReferenceFromProjectReferences"/>

【讨论】:

    【解决方案2】:

    已解决 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.) 首先从 .Net 核心类库项目中创建一个 Nuget 包。

    以管理员身份打开命令行。 转到 (cd) 到 .NET 核心类库项目 (.xproj) 的项目文件夹。

    运行以下命令:

    dotnet 包

    “pack”参数将从 .NET Core 类库中创建一个 nuget 包,并将该包复制到调试/发布文件夹,具体取决于您的项目配置。

    将 nuget 包文件复制到 您托管本地 nuget 包的文件夹。 我已将它们复制到:

    C:\Users\Admin.nuget\packages\LocalPackages\NetCore46ClassLibrary


    截图:
    2.) 如果您没有本地 Nuget 提要,则必须先创建一个!

    本地 Nuget 文件夹(我将其命名为“LocalPackages”)将托管您的自定义 Nuget 包。本地 Nuget Feed 将指向“LocalPackages”,这是所有本地包的根文件夹。

    创建本地 nuget 提要并将 .net 核心类库的 nuget 包复制到 localPackages 文件夹下的某个位置后,您就可以安装 .net 核心类库 nuget 包了。

    3.) 将 .NET Core 库 Nuget 包安装到 .NET 控制台应用中

    您现在必须再次打开包管理器控制台。 选择包源:本地包(这是我的本地提要名称,可能不同)。 默认项目应该是您的 .NET 控制台应用程序。

    在我的例子中,将您的 .net 核心类库 nuget 包安装到控制台应用程序中:

    install-package NetCore46ClassLibrary
    

    就是这样!

    我的系统

    dotnet --version
    1.0.0-preview2-003121

    【讨论】:

      【解决方案3】:

      可能是 Newtonsoft 程序集是 64 位的,而您的 .Net Core 项目是 32 位的。也可能是您引用了多个版本的 Newtonsoft。

      【讨论】:

        【解决方案4】:

        在 dotnet 核心控制台应用程序中包含 Newtonsoft.Json 6.0.8 后,我最近遇到了同样的错误。解决方案是将 System.Runtime.Serialization.Primitives 依赖项包含到 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"
            }
          }
        }
        

        【讨论】:

        • 我在 .net 标准 2.0 项目中遇到了那个错误,我在 nuget 中安装了“System.Runtime.Serialization.Primitives”,解决了,谢谢。
        【解决方案5】:

        作为解决方案,在 Visual Studio 2017 中,您可以将 NetStandard 项目 .csproj 修改为多目标:

                   <TargetFrameworks>netstandard1.3;net461</TargetFrameworks>
        

        重建解决方案,引用的 dll (NewtonSoft.JSON) 将被复制到控制台项目的 bin 文件夹中。

        看看我在 :Workaround Solution 中的实现

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-09
          • 2022-12-20
          • 1970-01-01
          • 2017-05-05
          • 1970-01-01
          • 2017-09-15
          • 1970-01-01
          • 2017-08-02
          相关资源
          最近更新 更多