È necessario aggiungere un riferimento all'assembly 'netstandard, Version = 2.0.0.0


124

Il progetto è un'app Web ASP.NET MVC destinata a .NET Framework 4.6.1.

All'improvviso (alcuni pacchetti NuGet sono stati aggiornati) ho iniziato a ricevere il seguente errore durante il runtime:

CS0012: il tipo "System.Object" è definito in un assembly a cui non si fa riferimento. È necessario aggiungere un riferimento all'assembly "netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51".

Nella mia vista principale Index.cshtml, in una riga in cui mi servo@Html.ActionLink

Ho .NET Core SDK 2.0 e .NET Framework 4.7.1 installati sulla mia macchina ma non voglio includere un riferimento ad esso. Questa è solo un'app Web .NET Framework, è ospitata su Windows IIS dove il framework installato è 4.6.1, non c'è NET Core installato nel server.

Allora perché chiede di aggiungere un riferimento a netstandard? Come posso risolverlo senza fare riferimento netstandarda Windows .NET Framework 4.6.1 completo?

Ho verificato un commit precedente che ha funzionato bene e ricevo ancora questo errore. Quindi non è correlato all'aggiornamento dei pacchetti NuGet. Sembra essere qualcosa sulla mia macchina di sviluppo locale.

Se si pubblica l'app in una directory e la si esegue con IIS, funziona.

Collegamento a .csproj gist

packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Antlr" version="3.5.0.2" targetFramework="net46" />
  <package id="BundleTransformer.Core" version="1.9.69" targetFramework="net46" />
  <package id="BundleTransformer.Handlebars" version="1.9.73" targetFramework="net46" />
  <package id="BundleTransformer.Less" version="1.9.69" targetFramework="net46" />
  <package id="BundleTransformer.Yui" version="1.9.52" targetFramework="net46" />
  <package id="Dapper" version="1.42" targetFramework="net46" />
  <package id="EcmaScript.Net" version="1.0.1.0" targetFramework="net46" />
  <package id="EntityFramework" version="6.0.0" targetFramework="net46" />
  <package id="Glimpse" version="1.8.6" targetFramework="net46" />
  <package id="Glimpse.AspNet" version="1.9.2" targetFramework="net46" />
  <package id="Glimpse.Mvc5" version="1.5.3" targetFramework="net46" />
  <package id="JavaScriptEngineSwitcher.Core" version="1.2.4" targetFramework="net46" />
  <package id="JavaScriptEngineSwitcher.V8" version="1.3.0" targetFramework="net46" />
  <package id="jQuery" version="2.1.3" targetFramework="net46" />
  <package id="jQuery.Validation" version="1.13.1" targetFramework="net46" />
  <package id="LowercaseDashedRoute" version="1.0.14" targetFramework="net46" />
  <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.Owin" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.SqlServer.Compact" version="4.0.8876.1" targetFramework="net46" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net46" />
  <package id="Moment.js" version="2.10.2" targetFramework="net46" />
  <package id="Newtonsoft.Json" version="10.0.3" targetFramework="net46" />
  <package id="NWebsec" version="5.1.1" targetFramework="net46" />
  <package id="NWebsec.Core" version="2.1.0" targetFramework="net46" />
  <package id="NWebsec.Mvc" version="5.1.1" targetFramework="net46" />
  <package id="Owin" version="1.0" targetFramework="net46" />
  <package id="Respond" version="1.4.2" targetFramework="net46" />
  <package id="Sendgrid" version="6.3.0" targetFramework="net46" />
  <package id="SendGrid.SmtpApi" version="1.3.1" targetFramework="net46" />
  <package id="Serilog" version="2.6.0" targetFramework="net46" />
  <package id="Serilog.Enrichers.Environment" version="2.1.2" targetFramework="net46" />
  <package id="Serilog.Sinks.File" version="3.2.0" targetFramework="net46" />
  <package id="Serilog.Sinks.RollingFile" version="3.3.0" targetFramework="net46" />
  <package id="Serilog.Sinks.Sentry" version="2.1.4" targetFramework="net46" />
  <package id="SerilogWeb.Classic" version="2.1.17" targetFramework="net46" />
  <package id="SharpRaven" version="2.2.0" targetFramework="net46" />
  <package id="System.Data.SQLite" version="1.0.108.0" targetFramework="net46" />
  <package id="System.Data.SQLite.Core" version="1.0.108.0" targetFramework="net46" />
  <package id="System.Data.SQLite.EF6" version="1.0.108.0" targetFramework="net46" />
  <package id="System.Data.SQLite.Linq" version="1.0.108.0" targetFramework="net46" />
  <package id="Twitter.Bootstrap.Less" version="3.3.4" targetFramework="net46" />
  <package id="WebActivatorEx" version="2.0.6" targetFramework="net46" />
  <package id="WebGrease" version="1.6.0" targetFramework="net46" />
  <package id="YUICompressor.NET" version="2.7.0.0" targetFramework="net46" />
</packages>

Quando si pubblica l'app utilizzando VS2017 nel file system, nell'output viene visualizzato il seguente avviso:

Il seguente assembly ha dipendenze da una versione di .NET Framework che è superiore alla destinazione e potrebbe non caricarsi correttamente durante il runtime causando un errore: netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51. Le dipendenze sono: System.Transactions, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089. È necessario assicurarsi che l'assembly dipendente sia corretto per il framework di destinazione o assicurarsi che il framework di destinazione a cui ci si riferisce sia quello dell'assembly dipendente.

Ma non riesco a trovare niente su System.Transactions. Come posso cercare cosa fa riferimento?


1
Quali pacchetti NuGet stai usando? Sei sicuro di non fare riferimento a un ASP.NET Core?
Ricardo Peres

@RicardoPeres VS2017 non ti consente di aggiungere un pacchetto destinato a un framework diverso da quello a cui il progetto si rivolge. Ho disinstallato e reinstallato tutti i pacchetti ma l'errore è lo stesso. Non capisco perché accade e anche perché durante il runtime ...
emzero

2
Il System.Data.SQLite.Corepacchetto è basato su .NET Core (o .NET Standard, non sono andato a cercare la fonte o la documentazione). Guarda il messaggio di errore alla fine del file di progetto.
McGuireV10

Perché hai detto che è basato su .NET Core? Sto guardando la packages\System.Data.SQLite.Core.1.0.108.0\libdirectory e contiene una cartella per ogni versione di .NET Framework, inclusa la 4.6 che è quella che sto usando. Non credo che sia questo il problema qui.
emzero

2
Quando devo affrontare problemi irrisolvibili come questo, quello che faccio è 1) annotare attentamente quali sono i riferimenti del progetto (o salvare il file .csproj da qualche parte), 2) rimuovere il file packages.config, rimuovere tutti i riferimenti esterni (in alternativa è possibile scrivere un nuovo progetto da zero solo con i file statici originali, .cs, ecc.), 3) configurare VS Nuget per utilizzare il riferimento al pacchetto invece della modalità legagy packages.config docs.microsoft.com/en-us/nuget/reference/… e 4) aggiungere di nuovo tutti i riferimenti necessari. Il più delle volte funziona e non ho idea del motivo per cui abbia fallito prima.
Simon Mourier

Risposte:


181

Penso che la soluzione potrebbe essere questo problema su GitHub :

Prova ad aggiungere netstandard reference in web.config in questo modo: "

<system.web>
  <compilation debug="true" targetFramework="4.7.1" >
    <assemblies>
      <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
            PublicKeyToken=cc7b13ffcd2ddd51"/>
    </assemblies>
  </compilation>
  <httpRuntime targetFramework="4.7.1" />

Mi rendo conto che stai usando 4.6.1 ma la scelta di .NET 4.7.1 è significativa poiché le versioni precedenti di Framework non sono completamente compatibili con .NET Standard 2.0.

Lo so per esperienza dolorosa, quando ho introdotto le librerie .NET Standard ho avuto molti problemi con i pacchetti NUGET e la rottura dei riferimenti. L'altra modifica che devi considerare è l'aggiornamento a PackageReferences invece che ai package.configfile.

Consulta questa guida e potresti anche volere uno strumento per aiutare l'aggiornamento . Tuttavia, richiede una versione tardiva di VS 15.7.


2
Penso che chiunque arrivi qui dovrebbe anche guardare a questa eccellente guida sulla scrittura di librerie open source dell'autore di Newtonsoft.JSON: docs.microsoft.com/en-us/dotnet/standard/library-guidance/… - in particolare "Evita incluso un target netstandard1.x "e utilizzare .NET 4.7.2 come la versione reale più bassa che supporta .netstandard 2.0
Quango

Esattamente ciò che era necessario durante l'aggiornamento alla v4.7.2 (app non di base) e ha ottenuto un'eccezione come la seguente: "Il tipo" DateTime "è definito in un assembly a cui non viene fatto riferimento. È necessario aggiungere un riferimento all'assembly" netstandard, versione = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51 '.
Ted

Questo deve anche essere aggiunto ai riferimenti nel file csproj o è necessario solo nel web.config?
petrosmm

1
Bella risposta. Grazie. Stavo aggiornando un vecchio pacchetto di utilità e al suo posto ho schiaffeggiato un nuovo standard 2.0. Questa app web in particolare ha avuto problemi perché <add assembly="netstandardmancava e anche httpRuntime non era 4.7.1- Questa è la risposta! Grazie !!
Piotr Kula

Nel nostro caso avevamo diversi assembly 2.0 standard in uso da un progetto ASP.Net 4.7.2, ma abbiamo aggiunto un po 'di JsonConverter dallo spazio dei nomi System.Text.Json.Serialization a uno dei progetti 2.0 standard e questo ha causato questo errore. Questa soluzione ha risolto il nostro problema.
ShaneH

35

La modifica manuale del file .csproj e l'aggiunta del riferimento di seguito ha funzionato per me.

<Reference Include="netstandard" />

Grazie a Fahad Alshaya che l'ha suggerito qui .


Dove dovrebbe essere messo all'interno del file di progetto? Dentro quale altro "tag"?
Ulysses Alves

1
@UlyssesAlves Da qualche parte accanto ad altri tag di riferimento
kamilk

@kamilk "da qualche parte accanto a qualche altro" non è molto preciso. Bene, ho esaminato alcuni altri progetti, ma sfortunatamente questo non ha funzionato per me e ho deciso di affrontare questo problema da un'altra prospettiva, che non comporta la modifica della versione .net del progetto.
Ulisse Alves

1
Questo ha funzionato per me, ho anche dovuto installare NetStandard.Library tramite NuGet.
David Acero,

Le piccole cose che ti "prendono" ... Ottima risposta.
Benj Sanders

15

Ho dovuto fare una combinazione delle risposte di altre persone su questo thread.

  1. Installa NetStandard.Library tramite NuGet
  2. Modifica manuale del file .csproj e aggiunta del riferimento. <Reference Include="netstandard" />
  3. Progetto in espansione -> Riferimenti in VS Solution Explorer, facendo clic con il pulsante destro del mouse su "netstandard" e visualizzando la pagina delle proprietà e impostando "Copia locale" su true.

3
L'impostazione "Copia locale" ha funzionato per me.
FrenkyB

1
Questa soluzione funziona perfettamente, inoltre il progetto non dipende dalla compilazione in modalità debug.
DarkHawk

6

Mi sono imbattuto in questo prima e provare una serie di cose lo ha risolto per me:

  • Elimina una cartella bin, se esiste
  • Elimina la cartella .vs nascosta
  • Assicurati che il pacchetto di targeting 4.6.1 sia installato
  • Last Ditch Effort: aggiungi un riferimento a System.Runtime (fai clic con il pulsante destro del mouse su progetto -> aggiungi -> riferimento -> spunta la casella accanto a System.Runtime), anche se penso di aver sempre capito che uno dei precedenti lo ha risolto invece di fare questo.

Inoltre, se si tratta di un'app .net core in esecuzione sul framework completo, ho scoperto che devi includere un file global.json nella radice del tuo progetto e indirizzarlo all'SDK che desideri utilizzare per quel progetto:

{
  "sdk": {
    "version": "1.0.0-preview2-003121"
  }
}

2
Ho provato tutto, senza fortuna. Questo non è un progetto .NET Core come ho detto. Questo è un normale .NET Framework 4.6.1.
emzero

Chiudi VS, elimina bin, elimina .vs - sono felice.
Reed Shilts


5

Dopo l'aggiornamento da 4.6.1 framework a 4.7.2 abbiamo iniziato a ricevere questo errore:

"Il tipo 'System.Object' è definito in un assembly a cui non si fa riferimento. È necessario aggiungere un riferimento all'assembly 'netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51'." e alla fine la soluzione era aggiungere il riferimento all'assembly "netstandard" menzionato sopra:

<compilation debug="true" targetFramework="4.7.1" >
    <assemblies>
      <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
            PublicKeyToken=cc7b13ffcd2ddd51"/>
    </assemblies>
  </compilation>

1
Funziona. Un'altra cosa che funziona (senza questa modifica) è aggiungere il <Reference Include="netstandard" />file csproj, MA ... funziona solo se imposti ANCHE CopyLocal su true. Niente di tutto questo ha senso.
Triynko

1

Sebbene si tratti di un vecchio thread, oggi ho riscontrato lo stesso problema, la settimana scorsa ho aggiornato alcuni pacchetti NuGet e sebbene il sito Web MVC funzionasse correttamente sulla mia macchina di sviluppo quando ho pubblicato sul server di test, non è riuscito.

Ho letto numerosi post ma nessuno ha funzionato. Alla fine ho confrontato le DLL nel mio cestino locale con quelle nel server di test e ho scoperto che netstandard.dll non è stato caricato, una volta caricato il sito Web ha funzionato bene, non sono sicuro del motivo per cui la distribuzione web di VS2017 non ha pubblicato la DLL.

Solo qualcosa a cui prestare attenzione nel caso in cui nessuno dei suddetti lavori per te.


1

L'ho riscontrato durante l'aggiornamento di .NET Core 1.1 a 2.1.

Ho seguito le istruzioni riportate qui .

Prova a rimuovere <RuntimeFrameworkVersion>1.1.1</RuntimeFrameworkVersion>o <NetStandardImplicitPackageVersion>sezione nel file .csproj.


1

Abbiamo iniziato a ricevere questo errore sul server di produzione dopo la distribuzione dell'applicazione migrata da 4.6.1 a 4.7.2.

Abbiamo notato che .NET framework 4.7.2 non era installato lì. Per risolvere questo problema, abbiamo eseguito i seguenti passaggi:

  1. Ha installato .NET Framework 4.7.2 da:

    https://support.microsoft.com/en-us/help/4054530/microsoft-net-framework-4-7-2-offline-installer-for-windows

  2. Ha riavviato la macchina

  3. Confermata la versione .NET Framework con l'aiuto di Come trovo la versione .NET?

L'esecuzione dell'applicazione di nuovo con la versione .Net Framework 4.7.2 installata sulla macchina ha risolto il problema.


1

Sto affrontando lo stesso problema che faccio dopo l'installazione ora L'applicazione funziona bene

1-

<compilation debug="true" targetFramework="4.7.1">
      <assemblies>
        <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
      PublicKeyToken=cc7b13ffcd2ddd51"/>
      </assemblies>
    </compilation>

2- Aggiungi riferimento

 **C:\Program Files (x86)\Microsoft Visual
Studio\2017\Professional\Common7\IDE\Extensions\Microsoft\ADL
 Tools\2.4.0000.0\ASALocalRun\netstandard.dll**

3-

Copy Above Path Dll to Application Bin Folder on web server


Dove è documentato? Qualcuno potrebbe indovinare di inserire questa riga in un file web.config? Per inciso, ciò che funziona altrettanto bene è l'aggiunta di una riga a csproj che fa riferimento a "netstandard" e l'impostazione di CopyLocal su true. Anche così, non è nemmeno elencato come possibile riferimento nella finestra di dialogo dei riferimenti da nessuna parte, quindi l'unico modo per ottenerlo è aggiungerlo manualmente. Questo è folle. E sto prendendo di mira .NET 4.7.2, che dovrebbe essere completamente compatibile con lo standard .NET, ma devo fare questi passaggi oscuri per farlo funzionare.
Triynko

0

Potrebbe avere a che fare con uno di questi:

  1. Installa un SDK più recente.
  2. In .csproj controlla Reference Include = "netstandard"
  3. Controllare le versioni dell'assembly nei tag di compilazione in Views \ Web.config e Web.config.

ok speriamo ci siamo quasi. "Ho aggiunto il riferimento a NETStandard.Library invece di NETStandard.Library.NETFramework" controlla questo post: github.com/dotnet/standard/issues/391
ivw

Di solito System.Transactions non fa parte dei tuoi riferimenti, prova ad aggiungerlo nei tuoi riferimenti: fai clic con il pulsante destro del mouse sui tuoi riferimenti se stai usando l'applicazione Web o nel tuo progetto se stai usando il sito web. trova System.Transactions nei riferimenti .NET. Dovresti trovare System.Transactions nei tuoi riferimenti.
ivw


0

Stavo affrontando questo problema quando provavo ad aggiungere una dipendenza .NETStandard a una libreria .NET4.6.1 e la compilavo in Linux con Mono 4.6.2 (la versione fornita con Ubuntu 16.04).

Finalmente l'ho risolto oggi; la soluzione richiede di fare entrambe queste cose:

  1. Modificare <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> in <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>nel file .csproj.
  2. Aggiorna il tuo mono a una versione più recente. Credo che 5.x dovrebbe funzionare, ma per essere sicuri, puoi semplicemente installare Ubuntu 20.04 (che al momento della scrittura è solo in anteprima), che include Mono 6.8.0.105.

0

Puoi aggiungere al tuo web.config nel tuo progetto.

Non funzionerebbe quando lo aggiungi ai progetti web.config perché funziona con MVC.


0

Nel mio caso ho scoperto che il nuget problematico era System.Memory nella versione 4.5.1. quando aggiornato alla versione 4.5.3 funziona !!


0

Coloro che non hanno il file web.config. Tipo di output diverso dall'applicazione web. aggiorna il file di progetto (.csproj) con il codice fornito di seguito.

Potrebbe causare a causa dell'aggiunta / rimozione di .netframework in modo improprio o potrebbe rompersi in modo imprevisto.

  <ItemGroup>
    <Reference Include="netstandard" />
  </ItemGroup>

Tipo di output

  • Applicazione console
  • Libreria di classi

-5

Questo problema si basa sulla versione installata di Visual Studio e Windows, puoi seguire i seguenti passaggi: -

  1. Vai alla finestra dei comandi
  2. ha eseguito il downgrade del PCL con il seguente comando

    Install-Package Xamarin.Forms -Version 2.5.1.527436
  3. Ricostruisci il tuo progetto.
  4. Ora sarai in grado di vedere l'output richiesto
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.