2016-07-13 6 views
10

(VS2015 Update 3 + Patch)Newtonsoft.JSON V9.01 + FileNotFoundException (.NET Core-Klassenbibliothek)

ich eine einfache -Konsolenanwendung haben (.NET 4.6) und eine .NET-Kernklassenbibliothek das zielt auf NetStandard v1.3 ab. Die Klassenbibliothek verweist auf 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" 
    } 
    } 
} 

Das referenzierte NewtonSoft.JSON Paket wird hier zum Einsatz:

C: \ Users \ Benutzerkonto \ .nuget \ packages \ Newtonsoft.Json \ 9.0.1

die Ausnahme :

Eine nicht behandelte Ausnahme des Typs 'System.IO.FileNotFoundException' aufgetreten in dotn etConsoleApplication.exe

Zusätzliche Informationen: Konnte Datei oder Assembly 'Newtonsoft.Json, Version = 9.0.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed' oder eine ihrer Abhängigkeiten laden. Das System kann die angegebene Datei nicht finden.

Ich denke, dass die .net-Core-Bibliothek die DLL aus dem Ordner netstandard1.0 referenzieren würde.

enter image description here

+0

Wie genau verweisen Sie auf diese Klassenbibliothek? – svick

+0

Add Reference-> Ich durchsucht zu NetStandardv1.3 Ordner: 'C: \ Benutzer \ UserAccount \ Documents \ Visual Studio 2015 \ Projekte \ ASP.NETcoreApp \ NetCore46ClassLibrary \ bin \ Debug \ netstandard1.3 \ NetCore46ClassLibrary.dll' – Legends

+0

@ Legenden Ich habe genau dasselbe Problem, hast du herausgefunden, wie das zu beheben ist? –

Antwort

2

Gelöst 31.07.2016

Erstellen Sie eine neue Ebene -Konsole-App (nicht .NET Core) und eine .NET-Core-Klassenbibliothek, ohne im Voraus zwischen ihnen keine Referenzierung zu tun.

Szenario:
1. Konsolenanwendung basierend auf .NET 4.6, die referenziert einen
2. Net Kernclasslibrary (hat einen Verweis auf Newtonsoft.JSON V9.01)

.NET Kern-Klassenbibliothek konfiguriert ist wie folgt (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" 
    } 
    } 
} 

Lösung

1.) Erstellen Sie zunächst ein Nuget-Paket aus dem .Net-Klassenbibliotheksprojekt.

Öffnen Sie die Befehlszeile als admin. Wechseln Sie (cd) in den Projektordner des .NET-Kernklassenbibliotheksprojekts (.xproj).

Führen Sie den folgenden Befehl ein:

    Dotnet Pack

enter image description here

Das "Paket" Parameter wird ein nuget Paket aus dem .NET-Core-Klassenbibliothek und kopieren Sie das Paket erstellen in den Debug/Release-Ordner, hängt von Ihrer Projektkonfiguration ab.

Kopieren Sie die Paketdateien in einen Ordner , in dem Sie Ihre lokalen nuget-Pakete hosten. Ich habe kopiert sie:

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


Screenshot: enter image description here
2.) Wenn Sie keinen lokalen Nuget-Feed haben, müssen Sie zuerst einen erstellen.

Der lokale Nuget-Ordner (ich nannte ihn "LocalPackages") hostet Ihre benutzerdefinierten Nuget-Pakete. Der lokale Nuget-Feed zeigt auf "LocalPackages", den Stammordner für alle lokalen Pakete.

enter image description here

Nachdem Sie das lokale nuget Feed erstellt und kopierte das nuget Paket Ihrer .net Kernklassenbibliothek irgendwo unter dem localPackages Ordner, sind Sie bereit, Ihr .net Kernklassenbibliothek nuget Paket zu installieren.

3.) Installieren Sie die .NET Core-Bibliothek Nuget Paket in die .NET-Konsolenanwendung

Sie jetzt wieder die Paket-Manager-Konsole zu öffnen haben. Wählen Sie Paketquelle: Lokale Pakete (Dies ist mein lokaler Feedname, möglicherweise anders). Und das Standardprojekt sollte Ihre .NET Konsole App sein.

enter image description here

Ihre .net Kernklassenbibliothek nuget Paket in die Konsole App installieren, in meinem Fall:

install-package NetCore46ClassLibrary 

Das ist es!

Mein System:
enter image description here

Dotnet --Version
1.0.0-preview2-003121

1

Könnte sein, dass die Newtonsoft Montage ist 64 Bit und Ihre .Net Kernprojekt ist 32 Bit. Es könnte auch sein, dass Sie mehrere Versionen von Newtonsoft referenziert haben.

1

hatte ich den gleichen Fehler vor kurzem nach Newtonsoft einschließlich. Json 6.0.8 in einer Dotnet-Core-Konsole App.Die Lösung bestand darin, die Abhängigkeit System.Runtime.Serialization.Primitives der config project.json hinzuzufügen.

{ 
    "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" 
    } 
    } 
} 
+0

Ich stieß auf diesen Fehler in einem .net Standard 2.0-Projekt, und ich installierte "System.Runtime.Serialization.Primitives" in nuget, gelöst, danke. – Teddy

4

Die Erstellung des NuGet-Pakets ist eine Lösung, aber nicht die einfachste.

Microsoft schließlich räumte ein, dass dies ein Problem ist und will fix es erwartungsgemäß in NuGet Version 4.0.1, das erste Update auf NuGet 4 nach VS 2017 Schiffe.

Die sauberste Problemumgehung ist jetzt, <RestoreProjectStyle>PackageReference</RestoreProjectStyle> zu einem Legacy-Projekt hinzuzufügen. Jedoch according to Rob Relyea MS wird diese Eigenschaft nach RTM ignorieren, so eine andere Problemumgehung ist <PackageReference Update="PlaceholderToConvinceThisProjectToGetTransitivePackageReferenceFromProjectReferences"/>.

0

Als Umgehungslösung, in Visual Studio 2017 können Sie die das NetStandard Projekt CSPROJ als Multi-Target ändern:

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

die Lösung neu erstellen und die referenzierte dll (NewtonSoft.JSON) wird in den Ordner bin des Konsolenprojekts kopiert werden.

Werfen Sie einen Blick auf meine Implementierung in: Workaround Solution