首页 文章

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

提问于
浏览
12

(VS2015 Update 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

例外情况:

DotNetConsoleApplication.exe中出现未处理的类型'System.IO.FileNotFoundException'异常附加信息:无法加载文件或程序集'Newtonsoft.Json,Version = 9.0.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed'或其中一个依赖 . 该系统找不到指定的文件 .

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

enter image description here

5 回答

  • 2

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

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

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

  • 0

    Solved 31.07.2016

    创建一个新的普通.NET控制台应用程序(不是.NET Core)和.NET Core类库,而不事先在它们之间进行任何引用 .

    Scenario:
    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.) Create a Nuget package from the .Net core class library project first.

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

    运行以下命令:

    dotnet pack

    enter image description here

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

    将nuget包文件复制到 folder where you host your local nuget packages . 我把它们复制到:

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

    Screenshot:
    enter image description here

    2.) If you don't have a local Nuget feed,you have to create one first!

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

    enter image description here

    在创建本地nuget提要并将localnetack文件夹下的.net核心类库的nuget包复制后,就可以安装.net核心类库nuget包了 .

    3.) Install the .NET Core library Nuget Package into the .NET console app

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

    enter image description here

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

    install-package NetCore46ClassLibrary
    

    而已 !

    My system

    enter image description here

    dotnet --version 1.0.0-preview2-003121

  • 1

    可能是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"
        }
      }
    }
    
  • 1

    As a workaround solution ,在Visual Studio 2017中,您可以将NetStandard项目.csproj修改为多目标:

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

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

    看看我的实现:Workaround Solution

相关问题