Impossibile trovare il tipo di provider CodeDom "Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider"


159

È un progetto WebApi che utilizza VS2015.

Passaggio per riprodurre:

  1. Creare un progetto WebApi vuoto
  2. Modifica il percorso di output della build da "bin \" a "bin \ Debug \"
  3. Correre

inserisci qui la descrizione dell'immagine

Tutto funziona perfettamente fino a quando non ho modificato il percorso di output della build da "bin \" a "bin \ Debug \" In effetti, qualsiasi percorso di output diverso da "bin \" non funzionerà.

Una piccola cosa aggiuntiva è che, avere un altro percorso di output verso qualsiasi posto funzionerebbe fintanto che ho lasciato una build in "bin \".

Aiutate a fornire una soluzione per risolvere questo problema. Immagino che costerà il problema sulla distribuzione effettiva.


Posso chiederti perché hai cambiato il percorso di output della tua applicazione web? Grazie.
X-Mao,

Questa eccezione mi sta accadendo ogni volta che aggiorno un'applicazione ASP.NET MVC precedentemente eseguita durante la compilazione di msbuild .
Nikolay Kostov,

Mi è successa la stessa cosa. È iniziato dopo aver aggiunto riferimenti a un paio di librerie .dll. L'ho risolto disinstallando e reinstallando le librerie. E non hanno idea del perché questo è accaduto di sorta ..
Letie Techera

Risposte:


127

Se il tuo progetto ha riferimenti Roslyn e lo stai distribuendo su un server IIS , potresti ricevere errori indesiderati sul sito Web poiché molti provider di hosting non hanno ancora aggiornato i loro server e quindi non supportano Roslyn.

Per risolvere questo problema, dovrai rimuovere il compilatore Roslyn dal modello di progetto . La rimozione di Roslyn non dovrebbe influire sulla funzionalità del codice. Ha funzionato bene per me e alcuni altri progetti (C # 4.5.2) su cui ho lavorato.

Procedi come segue:

  1. Rimuovere dai seguenti pacchetti Nuget utilizzando la riga di comando mostrata di seguito ( oppure è possibile utilizzare la GUI del gestore pacchetti Nuget facendo clic con il pulsante destro del mouse sulla soluzione di progetto principale e rimuovendoli ).

    PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
    PM> Uninstall-package Microsoft.Net.Compilers
  2. Rimuovere il codice seguente dal file Web.Config e riavviare IIS . ( Utilizzare questo metodo solo se il passaggio 1 non risolve il problema. )

    <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>


4
Sono stato bloccato su "errore del server nell'applicazione '/'" per circa un giorno ormai. Sto compilando una semplice applicazione Hello World in Visual Studio 2015, la sto distribuendo su un server Web e ottengo questo errore. La rimozione delle righe <compiler> sopra ha anche risolto il problema. Mi piacerebbe sapere come mai ciò accada e se esiste una soluzione migliore. Trovo abbastanza incredibile che non puoi distribuire un'app ciao mondo in questo modo senza colpire i problemi, è come se la MS non
eseguisse

4
Per abilitare Roslyn è possibile vedere il seguente articolo Abilitazione della piattaforma di compilatore .NET ("Roslyn") nelle applicazioni ASP.NET Perché la compilazione di Roslyn in ASP.NET? L'abilitazione dei nuovi compilatori Roslyn nell'applicazione ASP.NET comporterà due vantaggi principali: * Supporto per le nuove funzionalità del linguaggio * Tempo di avvio / pre-compilazione dell'applicazione potenzialmente migliorato
vibs2006

1
Quando ho creato un nuovo progetto Web, è arrivato con quei riferimenti già in atto. Perché sono installati di default, qual è il loro scopo? Anche per la mia comprensione Roslyn è il nuovo compilatore C #. In che modo rimuoverlo non rompe Visual Studio?
Jens Mander,

@JensMander sono entrambi tempi di compilazione. In IIS è necessario abilitare manualmente il compilatore Roslyn. Si prega di consultare il link nel mio commento precedente sull'articolo'Enabling the .NET Compiler Platform.
vibs2006,

Ho avuto lo stesso errore, finalmente aggiornato l'ultimo pacchetto per Microsoft.CodeDom.Providers.DotNetCompilerPlatform risolto per me.
Red

47

Fai attenzione a seguire il consiglio di questa risposta. Mentre risolve il problema a portata di mano, potrebbe causare problemi diversi in un secondo momento.

Ho avuto lo stesso problema. Apparentemente il compilatore .NET non è stato caricato in GAC. Quello che ho fatto per risolverlo è stato:

Innanzitutto, nel tipo di console del gestore pacchetti:

PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

Ora, per qualche motivo, i gentili signori di Microsoft hanno deciso di non installarlo sul GAC per noi. Puoi farlo manualmente aprendo il Prompt dei comandi per gli sviluppatori e digitando:

gacutil -i "C:\*PATH TO YOUR APP CODE*\bin\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll"

Conclusione

Microsoft cerca di incoraggiare tutti a fare tutto con i nuget che potrebbero andare bene senza i bug occasionali che incontri con il sistema nuget. Prova a utilizzare lo stesso progetto su soluzioni diverse, aggiorna accidentalmente (o meno) uno dei tanti nuget che utilizza su uno di essi, e se sei sfortunato vedrai cosa intendo quando provi a costruire l'altra soluzione. D'altra parte, l'inserimento di file nel GAC può anche causare problemi futuri poiché le persone tendono a dimenticare ciò che mettono lì e quindi quando creano nuovi ambienti dimenticano di includere questi file. Un'altra possibile soluzione è quella di mettere i file in una cartella centrale per DLL di terze parti (anche se è strano chiamare il compilatore di terze parti), che crea problemi di riferimenti non funzionanti durante l'impostazione di nuovi ambienti. Se decidi di installare la dll nel GAC, fai attenzione e ricorda che l'hai fatto. In caso contrario, scarica nuovamente il nuget per ciascun progetto e sopporta tutti i fastidiosi bug causati da esso (almeno accadeva quando alla fine mi sono stancato di esso e ho appena inserito i file nel GAC). Entrambi gli approcci potrebbero darti mal di testa e creare problemi, è solo una questione di quali problemi preferisci affrontare. Microsoft consiglia di utilizzare il sistema nuget e, in generale, è meglio ascoltarli piuttosto che un programmatore sconosciuto in SO, a meno che non si sia completamente stanchi del sistema nuget e si sia abituati a gestire il GAC abbastanza a lungo da essere un'alternativa migliore per te. scarica nuovamente il nuget per ogni progetto e sopporta tutti i fastidiosi bug causati da esso (almeno accadeva quando alla fine mi sono stancato di esso e ho appena inserito i file nel GAC). Entrambi gli approcci potrebbero darti mal di testa e creare problemi, è solo una questione di quali problemi preferisci affrontare. Microsoft consiglia di utilizzare il sistema nuget e, in generale, è meglio ascoltarli piuttosto che un programmatore sconosciuto in SO, a meno che non si sia completamente stanchi del sistema nuget e si sia abituati a gestire il GAC abbastanza a lungo da essere un'alternativa migliore per te. scarica nuovamente il nuget per ogni progetto e sopporta tutti i fastidiosi bug causati da esso (almeno accadeva quando alla fine mi sono stancato di esso e ho appena inserito i file nel GAC). Entrambi gli approcci potrebbero darti mal di testa e creare problemi, è solo una questione di quali problemi preferisci affrontare. Microsoft consiglia di utilizzare il sistema nuget e, in generale, è meglio ascoltarli piuttosto che un programmatore sconosciuto in SO, a meno che non si sia completamente stanchi del sistema nuget e si sia abituati a gestire il GAC abbastanza a lungo da essere un'alternativa migliore per te.


41
Non dovrebbe essere in GAC. L'intero punto dietro l'approccio di Nuget è che il tuo progetto usi una versione specifica di C # o VB.NET senza cambiare nulla sul sistema host. Vedi questo post di Damian Edwards di MSFT: blogs.msdn.microsoft.com/webdev/2014/05/12/…
Sudhanshu Mishra

30
Questi assiemi NON appartengono al GAC, periodo. Inserirli nel GAC comporterà un eventuale mal di testa quando qualcuno che ha bisogno di mantenere il codice non può determinare il motivo per cui viene utilizzato il compilatore sbagliato.
EKW,

5
-1 per le osservazioni di Microsoft. È come se fosse bello farlo in questi giorni. A proposito, i nuget hanno molti vantaggi che li hanno resi molto popolari che stai semplicemente ignorando. Ora immagina cosa penserebbero i signori Microsoft di questo.
Fabio Milheiro,

2
@YuvalPerelman Microsoft fa molte cose distruttive negli ultimi 3-4 anni (come destabilizzare Visual Studio, producendo prodotti di qualità molto bassa). A volte prego persino che venga licenziata l'intera direzione del dipartimento di sviluppo. Comunque non è assolutamente così!
Maris,

2
GAC'a questa dipendenza è la cosa più fantastica che abbia mai visto da un po '.
Svend

31

Aggiungi semplicemente il prossimo pacchetto nuget al tuo progetto - Microsoft.CodeDom.Providers.DotNetCompilerPlatform.

Ho avuto lo stesso problema.


Stai solo un po 'attento; sovrascrive 'compilerOptions' all'interno di web.config, quindi assicurati di salvare tutti i valori personalizzati prima dell'installazione.
Radderz,

19

Ho lo stesso problema che la mia app ha funzionato in Vs2013 ma ho riscontrato l'errore dopo l'aggiornamento a Vs2015.

  1. In Vs2015, fare clic con il pulsante destro del mouse sulla cartella Riferimenti del progetto per aprire Gestione pacchetti NuGet
  2. Nella scheda Sfoglia, cerca "DotNetCompilerPlatform" e installa "lib di Microsoft.CodeDom.Providers.DotNetCompilerPlatform"

2
Grazie per il suggerimento facendo clic con il pulsante destro del mouse sulla cartella Riferimenti del progetto per aprire il gestore pacchetti
garyh,

3
Prova a disinstallarlo prima, quindi installalo di nuovo in NuGet. Questo ha funzionato per me.
Matt

Sei una leggenda
Mo D Genesis,

16

So che è un vecchio thread, ma vorrei evidenziare il possibile problema di versione di DotNetCompilerPlatform.dll, f. ex. dopo un aggiornamento. Controllare se il nuovo file Web.config generato è diverso dal file web.config rilasciato, in particolare la parte system.codedom. Nel mio caso è stata la modifica della versione da 1.0.7 a 1.0.8. La nuova dll era già stata copiata sul server, ma non ho modificato il vecchio web.config (con alcune impostazioni speciali del server):

<pre>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
</pre>

Dopo aver aggiornato le due righe, l'errore è scomparso.


1
Ho problemi con DotNetCompilerPlatform ogni singolo tempo aggiorno esso.
LarryBud,

2
Se si rimuove l'attributo versione, funzionerà anche e si eviterà che l'errore si rialzi nuovamente al prossimo aggiornamento.
MiguelSlv,

Lo stesso problema che ho appena avuto tranne che ho dovuto aggiornare da 2.0.0a2.0.1
Rory McCrossan il

12

Secondo i passaggi della riproduzione, ho ipotizzato che la modifica del percorso di output nella proprietà dell'applicazione fosse l'unica modifica dopo aver creato l'applicazione. L'unica cosa che fa questa modifica è che dice a Visual Studio di inserire gli assembly di output di MSBuild nella nuova cartella. In fase di esecuzione, tuttavia, ASP.Net non avrebbe idea che avrebbe dovuto caricare gli assembly da questa nuova cartella anziché dalla cartella \ bin.

Questa risposta mostra il modo di cambiare la directory di output di compilazione di un'applicazione WebApi. Per ottenere lo stesso identico errore mostrato in quel post, devi commentare l'intera sezione <system.codedom> in web.config. E quindi è possibile seguire le istruzioni per modificare il percorso di output.

Dopo aver ottenuto il funzionamento dell'applicazione, è possibile decommentare la sezione <system.codedom>. Se non si utilizza affatto la nuova sintassi di C # 6 nella propria applicazione, è possibile disinstallare Microsoft.CodeDom.Providers.DotNetCompilerPlatform dalla propria applicazione; in caso contrario, potresti voler aggiungere la seguente riga di comando nel tuo evento post-build,

xcopy /Q /Y "$(TargetDir)roslyn\*.*" "$(TargetDir)..\roslyn\"

Il nuovo provider CodeDom cerca sempre la cartella "\ roslyn" in \ bin. Il comando sopra funziona come soluzione alternativa e copia la cartella \ roslyn dalla nuova cartella di output in \ bin.

Nei miei esperimenti, lo strumento di pubblicazione di Visual Studio, tuttavia, ha pubblicato gli assembly di output nella cartella \ bin nella posizione di distribuzione indipendentemente dalle impostazioni del percorso di output. Immagino che la tua applicazione dovrebbe funzionare ancora sulla distribuzione effettiva.


10

Modo semplice - Progetto> Gestisci pacchetti NuGet ...> Sfoglia (scheda)> nell'input di ricerca imposta questo: Microsoft.CodeDom.Providers.DotNetCompilerPlatform

È possibile installare o aggiornare o disinstallare e installare questo compilatore

DotNetCompilerPlatform


8

Un'altra possibile soluzione:

Riavvia l'istanza di Visual Studio con i diritti di amministratore

inserisci qui la descrizione dell'immagine


4

Si è arrestato dopo la pubblicazione sul server di produzione. Il motivo per cui mi ha mostrato questo errore è perché è stato distribuito in una sottocartella . In IIS ho cliccato a destra sulla sottocartella ed ho escogitato "Converti in applicazione" e dopo ha funzionato.


Converti in applicazione era tutto ciò di cui avevo bisogno. (Era un nuovo progetto che non era mai stato pubblicato prima.)
Patrick,

Anche l'uso di una sottocartella era il mio problema, quindi sono passato alla cartella di base e le cose hanno iniziato a funzionare.
J_L

4

Nel mio caso, ciò è accaduto quando ho cambiato l'autorizzazione della cartella dell'applicazione e l'account IIS_IUSRS è stato rimosso. Dopo aver aggiunto nuovamente IIS_IUSRS (Gestione IIS-> YourWebApp -> Modifica autorizzazione -> Aggiungi IIS_IUSRS) alla cartella dell'applicazione e ha funzionato.


Avevo aggiunto le autorizzazioni IUSR, ma non era adeguato. Ho dovuto aggiungere "IIS_IUSRS" e poi ha funzionato.
Zacharydl,

3

Ecco come l'ho risolto :

  1. Eliminata la bincartella nella directory del progetto.
  2. Clicca su Build Solution. In VS2017 (Esegui come amministratore)> Genera> Crea soluzione .


2

Avevo diversi progetti nella soluzione e il progetto Web (problema con questo errore) non è stato impostato come progetto StartUp. Ho impostato questo progetto Web come progetto StartUp e ho fatto clic sulla voce di menu "Debug" -> "Avvia debug" e ha funzionato. Ho smesso di eseguire il debug e poi ho provato di nuovo e ora è tornato a funzionare. Strano.


2

Quindi il problema è tornato. Ho disinstallato entrambi Microsoft.CodeDom.Providers.DotNetCompilerPlatforme Uninstall-package Microsoft.Net.Compilersma nessun aiuto. Quindi installato - nessun aiuto. Progetto pulito e nessun aiuto creato. Il server riavviato non ha aiutato.Quindi ho notato che il progetto non aveva bisogno dell'ultimo che è attualmente 1.0.5 ma 1.0.3 dato che l'errore non poteva caricare la versione 1.0.3. Quindi ho installato quella versione di dll invece e ora funziona.


1

ASP.NET non cerca bin/debugné alcuna sottocartella nel cestino per gli assembly come fanno altri tipi di applicazioni. Puoi indicare al runtime di guardare in un posto diverso usando la seguente configurazione:

<configuration>
   <runtime>   
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin\Debug;bin\Release"/>
      </assemblyBinding>
   </runtime>   
</configuration>

1

È necessario aggiornare i pacchetti "Microsoft.CodeDom.Providers.DotNetCompilerPlatform" e "Microsoft.Net.Compilers" nel progetto.


1

Nel mio caso, ho ricevuto l'errore quando avevo la mia applicazione Web in 4.5.2 e le librerie di classe di riferimento in 4.6.1. Quando ho aggiornato l'applicazione Web alla versione 4.5.2 l'errore è scomparso.


Ho effettivamente avuto lo stesso errore durante l'installazione di Umbraco 8, per la versione .Net errata (necessaria 4.7.2) anziché 4.5.2 (predefinito VS 2017)
Bunkerbuster

1

Stavo ottenendo questo errore perché il mio utente del pool di applicazioni era impostato su ApplicationPoolIdentity. L'ho cambiato in un account utente / servizio che ha accesso alla cartella e l'errore è andato via.


1

Ecco i miei risultati. Ho anche affrontato questo problema oggi mattina. Ho appena aggiunto il mio attuale utente al pool di applicazioni su cui l'applicazione era in esecuzione.

passi:

  1. Apri IIS

  2. Fare clic sul pool di applicazioni

  3. Seleziona il pool di applicazioni su cui stai riscontrando il problema

  4. Tasto destro del mouse -> impostazioni avanzate

  5. Fai clic sull'icona a tre punti accanto a identiy

  6. Ora seleziona un account personalizzato

  7. Fornisci il nome utente e la password del tuo PC

  8. Salva

Aggiorna la tua applicazione .. e inizierà a funzionare. Si è verificato un problema di sicurezza per l'accesso alla dll.


1

basta disinstallare il pacchetto dalla console di gestione dei pacchetti dal comando seguente

PM> Pacchetto di disinstallazione Microsoft.CodeDom.Providers.DotNetCompilerPlatform

PM> Pacchetti di disinstallazione Microsoft.Net.Compilers

e quindi installarlo nuovamente da Nuget Manager inserisci qui la descrizione dell'immagine


1

Se il Microsoft.CodeDom.Providers.DotNetCompilerPlatformpacchetto è stato installato o aggiornato di recente , ricontrollare che le versioni di quel pacchetto a cui si fa riferimento nel progetto facciano riferimento alla versione corretta e identica di quel pacchetto:

  • In ProjectName.csproj, assicurarsi che sia presente un <Import>tag per Microsoft.CodeDom.Providers.DotNetCompilerPlatforme punti alla versione corretta.

  • In ProjectName.csproj, assicurati che sia presente un <Reference>tag per Microsoft.CodeDom.Providers.DotNetCompilerPlatforme punti alla versione corretta, sia Includenell'attributo che nel figlio <HintPath>.

  • In quel progetto web.config, assicurati che il <system.codedom>tag sia presente e che i <compiler>tag secondari abbiano la stessa versione nel loro typeattributo.

Per qualche ragione, nel mio caso un aggiornamento di questo pacchetto da 1.0.5 a 1.0.8 causato la <Reference>tag nella .csprojad avere la sua Includepunta alla vecchia versione 1.0. 5 .0 (che avevo eliminato dopo aver aggiornato il pacchetto), ma tutto il resto puntava alla nuova e corretta versione 1.0. 8 .0.


1

Assicurati che il tuo progetto sia stato completamente realizzato!

Fai clic sulla scheda "Output" e assicurati di non avere qualcosa del tipo:

========== Ricostruisci tutto: 14 riusciti, 1 fallito, 0 saltato =========

E apri il tuo bin cartella e controlla se è aggiornato.

Ho avuto un sacco di errori dattiloscritti che inizialmente ho ignorato, dimenticando che stavano rompendo la build e portando a non essere copiati DLL.


1

Aggiungere un riferimento all'assembly CppCodeProvider.


1

Nel mio caso il mio progetto Web non è stato caricato correttamente (mostrava il progetto non disponibile), quindi ho dovuto ricaricare il mio progetto Web dopo aver aperto Visual Studio in modalità amministratore, quindi tutto ha funzionato correttamente.


0

Ho avuto lo stesso problema ed è stato perché ho spostato la posizione del progetto e ho semplicemente bisogno di ricreare la directory virtuale.


0

L'eccezione che abbiamo riscontrato non era sul locale ma sul server remoto, Azure CI lo stava leggendo dalla cartella dei pacchetti ma le versioni del compilatore sopra menzionate non sono state trovate.

Per risolvere questo problema abbiamo modificato il file di progetto per renderlo simile

Non fa riferimento a nessuno dei pacchetti che fanno riferimento direttamente alle variabili di ambiente.

Ciò ha risolto il problema, tuttavia nei nostri casi non utilizziamo i pacchetti direttamente da "package.config" invece abbiamo una cartella separata per mantenere l'integrità della versione tra i team.


0

Vai a inetmgr dal comando di avvio Nella console di gestione IIS, seleziona la cartella dell'applicazione in Sito Web predefinito, fai clic con il pulsante destro del mouse su quella cartella, quindi Converti in applicazione Esegui il file .asmx Abilitando Ha risolto il problema


0

Controlla se la BINcartella è stata caricata completamente o mancante nei file.


Sto anche affrontando lo stesso problema, abbastanza nuovo per asp.net
Prashant Pimpale,

0

Per quanto riguarda questo errore ho provato:

  • Pulizia e ricostruzione del progetto
  • Scaricare e ricaricare il progetto
  • Modifica del Target Framework
  • Modifica del percorso di output
  • Aggiunta di pepite al GAC
  • Eliminazione dei pacchetti uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform uninstall-package Microsoft.Net.Compilerse installazione di nuovo.

Mentre tutte queste sembrano essere soluzioni valide, sono stato in grado di generare nuovi errori e alla fine, l'errore sembra essere in grado di visualizzare quando mancano determinati riferimenti / nuget.

Nel mio caso, di recente avevo reinstallato Microsoft Office e facevo riferimento a assembly come Microsoft.Office.Core. La nuova installazione non sembra includere i pacchetti richiesti, il che ha reso la mia soluzione impossibile compilare correttamente.

Sono stato in grado di risolvere questo problema rielaborando il mio codice al punto in cui non avevo bisogno di fare riferimento a Microsoft.Office, ma avrei potuto risolverlo cercando i pacchetti richiesti e installandoli di conseguenza.

Sembra un messaggio di errore poco chiaro da Visual Studio.


0

Se hai lavorato a un progetto e questo è appena apparso come errore. REBOOT il tuo computer (o server nel mio caso) questo ha risolto il problema per me.

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.