Newtonsoft.JSON v9.01 + FileNotFoundException(.NET核心类库)

时间:2016-07-13 10:36:48

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

(VS2015 Update 3 + Patch)

我有一个普通的.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:\用户\ UserAccount \ .nuget \包\ Newtonsoft.Json \ 9.0.1

例外:

  

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

中      

其他信息:无法加载文件或程序集   'Newtonsoft.Json,Version = 9.0.0.0,Culture = neutral,   PublicKeyToken = 30ad4fe6b2a6aeed'或其中一个依赖项。该   系统找不到指定的文件。

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

enter image description here

5 个答案:

答案 0 :(得分:4)

创建NuGet包是一个解决方案,但不是最容易的解决方案。

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

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

答案 1 :(得分: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

enter image description here

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

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

  

<强> C:\用户\ Admin.nuget \包\ LocalPackages \ NetCore46ClassLibrary


截图: enter image description here
2。)如果您没有本地Nuget Feed,则必须先创建一个!

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

enter image description here

创建本地nuget订阅源并将.net核心类库的nuget包复制到localPackages文件夹下的某个位置后,即可安装.net核心类库nuget包。

3.。)将.NET Core库Nuget Package安装到.NET控制台应用程序

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

enter image description here

在我的情况下将.net核心类库nuget包安装到控制台应用程序中:

install-package NetCore46ClassLibrary

就是这样!

我的系统
enter image description here

  

dotnet --version
  1.0.0-preview2-003121

答案 2 :(得分:1)

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

答案 3 :(得分:1)

最近我在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"
    }
  }
}

答案 4 :(得分:0)

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

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

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

Workaround Solution

中查看我的实施情况