Verwenden von System.Dynamic in Roslyn

96

Ich habe das Beispiel mit der neuen Version von Roslyn, die gestern veröffentlicht wurde, geändert, um Dynamic und ExpandoObject zu verwenden, aber ich erhalte einen Compilerfehler, dessen Behebung ich nicht sicher bin. Der Fehler ist:

(7,21): Fehler CS0656: Fehlender Compiler erforderlich Mitglied 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

Können Sie die Dynamik im neuen Compiler noch nicht verwenden? Wie kann ich das beheben? Hier ist das Beispiel, das ich aktualisiert habe:

[TestMethod]
public void EndToEndCompileAndRun()
{
    var text = @"using System.Dynamic;
    public class Calculator
    {
        public static object Evaluate()
        {
            dynamic x = new ExpandoObject();
            x.Result = 42;
            return x.Result;
        } 
    }";

    var tree = SyntaxFactory.ParseSyntaxTree(text);
    var compilation = CSharpCompilation.Create(
        "calc.dll",
        options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary),
        syntaxTrees: new[] {tree},
        references: new[] {new MetadataFileReference(typeof (object).Assembly.Location), new MetadataFileReference(typeof (ExpandoObject).Assembly.Location)});

    Assembly compiledAssembly;
    using (var stream = new MemoryStream())
    {
        var compileResult = compilation.Emit(stream);
        compiledAssembly = Assembly.Load(stream.GetBuffer());
    }

    Type calculator = compiledAssembly.GetType("Calculator");
    MethodInfo evaluate = calculator.GetMethod("Evaluate");
    string answer = evaluate.Invoke(null, null).ToString();

    Assert.AreEqual("42", answer);
}
Rush Frisby
quelle

Antworten:

219

Ich denke, dass Sie sich auf die Microsoft.CSharp.dllVersammlung beziehen sollten

Alberto
quelle
3
Ja, das ist etwas, was seit dynamicseiner Einführung erforderlich war.
Khellang
19
Und wenn Microsoft eine Fehlermeldung geben würde, die Ihnen sagt, dass dies der Fall ist, würde dies die Dinge so viel einfacher machen.
Kjbartel
1
Ich weiß nicht, ob dies das Problem behoben hat oder nicht, aber ich habe <add namespace = "Microsoft.CSharp" /> zu meinem Knoten Views / Web.config <namespaces> hinzugefügt. Der Compilerfehler ist jetzt weg.
Don Rolling
3
FWIW Hinzufügen von Microsoft.CSharp.dll bedeutet var scriptOptions = ScriptOptions.Default.WithReferences ("Microsoft.CSharp"), dh Löschen der DLL. Stumped mich für ein paar Minuten :)
Jon H
@ JonH, also sollten wir diese Zeile zu AssemblyInfo.cs oder irgendwo hinzufügen, anstatt auf die DLL zu verweisen?
NH.
9

Damit der Code in .Net Core 2.1 funktioniert, musste ich diese Referenzen in die Kompilierung aufnehmen:

var compilation = CSharpCompilation.Create(
    "calc.dll",
    options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary),
    syntaxTrees: new[] {tree},
    references: new[] {
        MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
        MetadataReference.CreateFromFile(typeof(ExpandoObject).Assembly.Location),
        MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("Microsoft.CSharp")).Location),
        MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("netstandard")).Location),
        MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("mscorlib")).Location),
        MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("System.Runtime")).Location),            
    }
);
Renzo Ciot
quelle
Sie können mit System.Linq.Expressions, System.Private.CoreLib, System.Runtime und Microsoft.CSharp davonkommen, alle als Zeichenfolgen
Simon Mourier
7

ASP.NET MVC-spezifisch:

Sie können diesen Fehler in einem MVC 6-Controller erhalten, wenn Sie vergessen, [FromBody]eine POSTMethode einzugeben.

    [HttpPost("[action]")]
    public void RunReport([FromBody]dynamic report)
    {
        ...
    }

Das .NETCore-Standardprojekt enthält bereits eine Microsoft.CSharpReferenz, aber Sie erhalten fast dieselbe Meldung.

Mit [FromBody]hinzugefügt können Sie jetzt JSON posten und dann einfach dynamisch auf die Eigenschaften zugreifen :-)

Simon_Weaver
quelle
Ich dachte, es trifft nicht auf die ursprüngliche Frage aus dem Jahr 2014 zu (obwohl ich anerkennen wollte, dass es hilfreich ist). Ich war mir nicht sicher, was die SO-Etikette in einer solchen Situation vorschrieb.
tj
Fairer Punkt :) Ich habe es gerade hier hinzugefügt, weil es so dunkel schien und dies eine gute Übereinstimmung für diesen Fehler war
Simon_Weaver
4

Möglicherweise möchten Sie auch die Eigenschaften aller Ihrer Projektreferenzen überprüfen. Stellen Sie sicher, dass eine Referenz .NET verwendet, das neuer als 2.0 ist. Ich habe ein Projekt, das auf ein anderes Projekt in derselben Lösung verweist und die Abhängigkeit mithilfe eines neueren .NET Framework-Ziels neu erstellen musste.

Siehe diesen Beitrag .

Vergessen Sie auch nicht, den Microsoft.CSharpVerweis auf Ihr Hauptprojekt hinzuzufügen, wie @Alberto sagte.

A.Clymer
quelle
1

Wenn Ihr Projekt auf .Net Core oder .Net Standard abzielt, können Sie anstelle eines Verweises das Microsoft.CSharp NuGet-Paket installieren , um diesen Fehler zu beheben.

Kolappan N.
quelle