2016-07-13 61 views
10

(VS2015 Update 3 + Patch)Newtonsoft.JSON v9.01 + FileNotFoundException (biblioteca NET Nucleo Classe)

Ho un'applicazione console pianura NET (.NET 4.6) e fare riferimento a una libreria di classi .NET nucleo che si rivolge a NetStandard v1.3. La libreria di classi ha un riferimento a 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" 
    } 
    } 
} 

Il pacchetto NewtonSoft.JSON riferimento viene distribuito qui:

C: \ Users \ AccountUtente \ .nuget \ pacchetti \ Newtonsoft.Json \ 9.0.1

L'eccezione :

Un'eccezione non gestita di tipo 'System.IO.FileNotFoundException' si è verificata in DotN etConsoleApplication.exe

Ulteriori informazioni: Impossibile caricare il file o l'assembly 'Newtonsoft.Json, Version = 9.0.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed' o una delle sue dipendenze. Il sistema non riesce a trovare il file specificato.

Suppongo che il nucleo .net di lib faccia riferimento alla DLL dalla cartella netstandard1.0.

enter image description here

+0

esattamente come si fa riferimento che libreria di classi? – svick

+0

Aggiungi riferimento-> Ho sfogliato la cartella NetStandardv1.3: 'C: \ Users \ Account utente \ Documenti \ Visual Studio 2015 \ Projects \ ASP.NETcoreApp \ NetCore46ClassLibrary \ bin \ Debug \ netstandard1.3 \ NetCore46ClassLibrary.dll' – Legends

+0

@ Leggende Ho lo stesso identico problema, hai scoperto come risolverlo? –

risposta

2

risolto 31.07.2016

Creare una nuova pianura .NET console app (non .NET Core) e una libreria di classi .NET core, senza fare alcun riferimento tra di loro in anticipo.

Scenario:
1. Console un'applicazione basata su .NET 4.6, che fa riferimento a un
2. .Net Nucleo ClassLibrary (ha un riferimento a Newtonsoft.JSON v9.01)

.NET libreria di classe principale è configurato come segue (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" 
    } 
    } 
} 

Soluzione

0.123.516,410617 millions

1.) Creare innanzitutto un pacchetto Nuget dal progetto della libreria di classi core .Net.

Aprire la riga di comando come admin. Passare (cd) alla cartella di progetto del progetto di libreria di classi core .NET (.xproj).

Eseguire il seguente comando:

    dotnet pacchetto

enter image description here

Il parametro "pacchetto" creerà un pacchetto NuGet fuori dalla libreria di classi .NET Core e copiare il pacchetto alla cartella debug/release, dipende dalla configurazione del progetto.

Copia i file del pacchetto nuget in una cartella in cui sono ospitati i pacchetti nuget locali. li ho copiati:

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


Screenshot: enter image description here
2.) Se non hai un feed Nuget locale, devi prima crearne uno!

La cartella Nuget locale (l'ho denominata "LocalPackages") ospiterà i pacchetti personalizzati di Nuget. Il feed Nuget locale punta a "LocalPackages", che è la cartella principale per tutti i pacchetti locali.

enter image description here

Dopo aver creato il feed NuGet locale e copiato il pacchetto NuGet della vostra libreria di classi di base .NET da qualche parte sotto la cartella localPackages, si è pronti per installare il pacchetto di base Libreria di classi .NET NuGet.

3.) Installare la libreria .NET Nucleo Nuget pacchetto nella console app .NET

è ora di aprire nuovamente la console di Package Manager. Scegli Origine pacchetto: Pacchetti locali (questo è il nome del mio feed locale, potrebbe essere diverso). E il progetto predefinito dovrebbe essere l'app per console .NET.

enter image description here

Installare il pacchetto di classe principale NuGet Biblioteca NET nella console app, nel mio caso:

install-package NetCore46ClassLibrary 

Questo è tutto!

mio sistema:
enter image description here

dotnet --version
1.0.0-preview2-003121

1

potrebbe essere che l'assemblea Newtonsoft è a 64 bit e il progetto Net Core è a 32 bit. Potrebbe anche darsi che tu abbia più versioni di Newtonsoft referenziate.

1

ho avuto lo stesso errore di recente, dopo aver incluso Newtonsoft. JSON 6.0.8 in un'app console core dotnet.La soluzione era includere la dipendenza System.Runtime.Serialization.Primitives da project.json config.

{ 
    "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

Ho riscontrato tale errore in un progetto .net standard 2.0 e ho installato "System.Runtime.Serialization.Primitives" in nuget, risolto, grazie. – Teddy

4

La creazione del pacchetto NuGet è una soluzione ma non la più semplice.

Microsoft ha infine ammesso che questo è un problema e will fix esso, prevedibilmente, in NuGet versione 4.0.1, il primo aggiornamento a NuGet 4 dopo VS 2017 viene fornito.

La soluzione più semplice ora è aggiungere <RestoreProjectStyle>PackageReference</RestoreProjectStyle> a un progetto legacy. Tuttavia, according to Rob Relyea MS ignorerà questa proprietà dopo RTM, quindi un'altra soluzione è <PackageReference Update="PlaceholderToConvinceThisProjectToGetTransitivePackageReferenceFromProjectReferences"/>.

0

Come soluzione soluzione, in Visual Studio 2017, è possibile modificare il progetto NetStandard .csproj come multi-target:

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

ricostruire la soluzione e la DLL di riferimento (NewtonSoft.JSON) sarà essere copiati nella cartella bin del progetto della console.

Date un'occhiata alla mia implementazione in: Workaround Solution