Usando System.Dynamic en Roslyn


96

Modifiqué el ejemplo que viene con la nueva versión de Roslyn que se lanzó ayer para usar Dynamic y ExpandoObject, pero recibo un error del compilador que no estoy seguro de cómo solucionarlo. El error es:

(7,21): error CS0656: Falta el miembro obligatorio del compilador 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

¿Todavía no puedes usar la dinámica en el nuevo compilador? ¿Cómo puedo arreglar esto? Aquí está el ejemplo que actualicé:

[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);
}

Respuestas:


219

Creo que deberías hacer referencia a la Microsoft.CSharp.dllasamblea.


3
Sí, esto es algo que se requiere desde que dynamicse introdujo.
khellang

19
Y si Microsoft le diera un mensaje de error que le dijera que esto haría las cosas mucho más fáciles.
kjbartel

1
No sé si esto solucionó el problema o no, pero agregué <add namespace = "Microsoft.CSharp" /> en mi nodo Vistas / Web.config <namespaces>. El error del compilador desapareció ahora.
Don Rolling

3
FWIW agregar Microsoft.CSharp.dll significa var scriptOptions = ScriptOptions.Default.WithReferences ("Microsoft.CSharp") es decir, eliminar el dll. Me dejó perplejo por unos minutos :)
Jon H

@JonH, ¿deberíamos agregar esa línea a AssemblyInfo.cs o en algún lugar en lugar de hacer referencia a la dll?
NH.

9

Para que el código funcione en .Net Core 2.1 tuve que agregar estas referencias en la compilación:

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),            
    }
);

Puede salirse con la suya con System.Linq.Expressions, System.Private.CoreLib, System.Runtime y Microsoft.CSharp, todo como cadenas
Simon Mourier

7

ASP.NET MVC específico:

Puede obtener este error en un controlador MVC 6 si olvida poner [FromBody]un POSTmétodo.

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

El proyecto predeterminado de .NETCore ya incluye una Microsoft.CSharpreferencia, pero obtienes prácticamente el mismo mensaje.

Con [FromBody]agregado, ahora puede publicar JSON y luego simplemente acceder dinámicamente a las propiedades :-)


Pensé que no se aplicaba a la pregunta original publicada en 2014 (aunque quería reconocer que fue útil). No estaba seguro de lo que dictaba la etiqueta SO en tal situación.
tj

Punto justo :) Lo acabo de agregar aquí porque parecía muy oscuro y esta era una buena
combinación

4

También es posible que desee comprobar las propiedades de todas las referencias de su proyecto. Asegúrese de que cualquier referencia utilice .NET posterior a 2.0. Tengo un proyecto que hacía referencia a otro proyecto en la misma solución y tuve que reconstruir la dependencia utilizando un objetivo de marco .NET más nuevo.

Ver esta publicación .

Además, no olvide agregar la Microsoft.CSharpreferencia a su proyecto principal como dijo @Alberto.


1

Si su proyecto tiene como objetivo .Net Core o .Net Standard, en lugar de agregar una referencia, puede instalar el paquete Microsoft.CSharp NuGet para resolver este error.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.