c# - significado - roslyn new york
Usando System.Dynamic en Roslyn (3)
Creo que debe hacer referencia al ensamblado Microsoft.CSharp.dll
Modifiqué el ejemplo que viene con la nueva versión de Roslyn que fue lanzada ayer para usar Dynamic y ExpandoObject, pero estoy obteniendo un error de compilación que no estoy seguro de cómo solucionarlo. El error es:
(7,21): error CS0656: miembro requerido del compilador faltante ''Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create''
¿No puedes usar dinámicas en el nuevo compilador todavía? ¿Cómo puedo arreglar esto? Este es 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);
}
Puede obtener este error en un controlador MVC 6 si olvida poner [FromBody]
en un método POST
.
[HttpPost("[action]")]
public void RunReport([FromBody]dynamic report)
{
...
}
El proyecto predeterminado .NETCore ya incluye la referencia de Microsoft.CSharp
pero obtienes prácticamente el mismo mensaje.
Con [FromBody]
agregado, ahora puede publicar JSON y luego acceder dinámicamente a las propiedades :-)
También es posible que desee comprobar las propiedades de todas las referencias de su proyecto. Asegúrese de que cualquier referencia esté usando .NET más nuevo que 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 nuevo objetivo de .NET Framework.
Ver esta post
Además, no olvide agregar la referencia de Microsoft.CSharp
a su proyecto principal, como dijo @ Alberto.