在Roslyn中使用System.Dynamic

Rus*_*sby 94 c# roslyn

我修改了昨天发布的新版Roslyn附带的示例,以使用动态和ExpandoObject,但我收到编译器错误,我不知道如何修复.错误是:

(7,21):错误CS0656:缺少编译器所需的成员'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

你能否在新的编译器中使用动态?我怎样才能解决这个问题?以下是我更新的示例:

[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);
}
Run Code Online (Sandbox Code Playgroud)

Alb*_*rto 219

我认为你应该参考Microsoft.CSharp.dll大会

  • 如果微软给出了一条错误消息,告诉你这将使事情变得如此简单. (18认同)
  • 是的,这是自"动态"引入以来所需要的一些东西. (3认同)
  • FWIW添加Microsoft.CSharp.dll意味着var scriptOptions = ScriptOptions.Default.WithReferences("Microsoft.CSharp")即删除dll.难倒我几分钟:) (3认同)

Sim*_*ver 7

ASP.NET MVC具体:

如果您忘记[FromBody]输入POST方法,则可以在MVC 6控制器中获得此错误.

    [HttpPost("[action]")]
    public void RunReport([FromBody]dynamic report)
    {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

.NETCore默认项目已经包含Microsoft.CSharp引用,但您得到的信息几乎相同.

随着[FromBody]加入你现在可以发布JSON,然后就动态地访问属性:-)


Ren*_*iot 7

为了使代码在.Net Core 2.1中工作,我必须在编译中添加以下引用:

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),            
    }
);
Run Code Online (Sandbox Code Playgroud)