Non è possibile trovare uno o più tipi richiesti per compilare un'espressione dinamica. Mancano riferimenti a Microsoft.CSharp.dll e System.Core.dll?


287

Sto cercando di compilare questo codice in Microsoft Visual C # 2010

using System;
using System.Globalization;


class main
{
    static void Main()
    {

        dynamic d;
        d = "dyna";
        Console.WriteLine(d);    
    }
}

ma sto ricevendo questi due errori

Errore 1 Il tipo predefinito 'Microsoft.CSharp.RuntimeBinder.Binder' non è definito o importato

Errore 2 Impossibile trovare uno o più tipi richiesti per compilare un'espressione dinamica. Mancano riferimenti a Microsoft.CSharp.dll e System.Core.dll?

Ho letto questo altro post ma sono nuovo di C # e non sono riuscito a capire quale sia il problema. Soprattutto cosa e dove sono questi cosiddetti .configfile ..


25
Controlla i tuoi riferimenti. Fare clic con il tasto destro e "Aggiungi riferimento .." Cercare "Microsoft.CSharp.dll" e aggiungerlo. Di solito System.Core.dll viene fornito di serie quando si crea un nuovo progetto, non sono così sicuro di CSharp.dll
Internet

Risposte:


586

Nella finestra di Esplora soluzioni, fai clic con il pulsante destro del mouse su Riferimenti, seleziona Aggiungi riferimento, vai alla scheda .NET, trova e aggiungi Microsoft.CSharp.


26
Il mio era già referenziato, ma avevo ancora questo errore. Avevo creato una nuova applicazione ASP.Net MVC4 in VS 2010. Sconcertata, l'ho rimossa e ritoccata e l'errore è scomparso. La pulizia / ricostruzione non ha aiutato.
Paul,

@Paul: lo stesso è successo a me dopo aver aggiornato un progetto da 4.0 a 4.5. La versione # / etc è la stessa tra 4.0 / 4.5 IIRC che potrebbe essere il motivo.
Steven Evers,

13
Il team di Visual Studio dovrebbe davvero pensare di lasciare che le persone
passino

8
@Geoyws Una sola parola: ReSharper.
user2864740

2
@ user2864740 Normalmente Resharper lo fa. Ma in questo caso, ReSharper non mostrerà nulla.
Pulle,

21

Assicurarsi che il progetto sia destinato a .NET Framework 4.0. Visual Studio 2010 supporta anche la destinazione del framework .NET 3.5, ma .NET 3.5 non supporta la dynamicparola chiave.

È possibile regolare la versione del framework nelle proprietà del progetto. Vedere http://msdn.microsoft.com/en-us/library/bb398202.aspx per ulteriori informazioni.


7

Ho avuto lo stesso problema, tranne la rimozione e l'aggiunta del riferimento non risolto l'errore, quindi ho cambiato la versione .Net da 4.5a 4.5.1.

Per ottenere ciò, vai al tuo web.configfile e modifica le seguenti righe

<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />

a questa

<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" />

e ricostruire.


6

Le linee rosse sotto il ViewBag sono state il mio mal di testa per 3 mesi). Basta rimuovere il riferimento Microsoft.CSharp dal progetto e quindi aggiungerlo di nuovo.


3
questo non ha funzionato per me anche quando ho anche delle linee rosse nella mia linea
ViewBag

1

Ho avuto lo stesso problema e l'ho risolto rimuovendo il riferimento "Microsoft.CSharp" dal progetto e poi l'ho aggiunto di nuovo.


1

Per me, rimuovere e aggiungere nuovamente un riferimento a Microsoft.CSharp ha risolto temporaneamente il problema fino a quando il file interessato non veniva modificato. La chiusura di Visual Studio e la riapertura del progetto lo hanno risolto più a lungo termine, quindi questa è un'opzione se questa situazione si verifica mentre Microsoft.CSharp è già referenziato.

Forse riavviare l'IDE come primo passo sembra banale, ma ecco un promemoria per persone come me che non la considerano la prima cosa da fare.


0

Nessuno di questi ha funzionato per me.

Le mie librerie di classe facevano sicuramente tutte riferimento a System.Core e Microsoft.CSharp. L'applicazione Web era 4.0 e non è stato possibile eseguire l'aggiornamento a 4.5 a causa di problemi di supporto.

Stavo riscontrando l'errore durante la compilazione di un modello di rasoio utilizzando Razor Engine e l'ho riscontrato solo in modo intermittente, come dopo il riavvio dell'applicazione Web.

La soluzione che ha funzionato per me era caricare manualmente l'assemblaggio e quindi tentare nuovamente la stessa operazione ...

        bool retry = true;
        while (retry)
        {
            try
            {
                string textTemplate = File.ReadAllText(templatePath);
                Razor.CompileWithAnonymous(textTemplate, templateFileName);
                retry = false;
            }
            catch (TemplateCompilationException ex)
            {
                LogTemplateException(templatePath, ex);
                retry = false;

                if (ex.Errors.Any(e  => e.ErrorNumber == "CS1969"))
                {
                    try
                    {
                        _logger.InfoFormat("Attempting to manually load the Microsoft.CSharp.RuntimeBinder.Binder");
                        Assembly csharp = Assembly.Load("Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
                        Type type = csharp.GetType("Microsoft.CSharp.RuntimeBinder.Binder");
                        retry = true;
                    }
                    catch(Exception exLoad)
                    {
                        _logger.Error("Failed to manually load runtime binder", exLoad);
                    }
                }

                if (!retry)
                    throw;
            }
        }

Spero che questo possa aiutare qualcun altro là fuori.


-2

Se perdi, Microsoft.CSharp.dll questo errore può verificarsi. Controlla i riferimenti del tuo progetto.


3
Benvenuto in Stack Overflow! Potresti voler includere un esempio di codice o più di una spiegazione. Sembra più un commento,
Gary Storey,

5
In pratica hai detto la stessa cosa della risposta accettata data 3 anni fa.
Ilya Luzyanin,
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.