在 Roslyn 中使用 System.dynamic

本文关键字:System dynamic Roslyn | 更新日期: 2023-09-27 17:56:43

我修改了昨天发布的新版本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);
}

在 Roslyn 中使用 System.dynamic

我认为您应该引用Microsoft.CSharp.dll程序集

为了使代码在.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),            
    }
);

ASP.NET MVC 特定:

如果您忘记将[FromBody]放入POST方法中,则可能会在 MVC 6 控制器中收到此错误。

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

这。NETC更多默认项目已经包含Microsoft.CSharp引用,但您得到的消息几乎相同。

添加[FromBody]后,您现在可以发布 JSON,然后动态访问属性:-)

您可能还需要检查所有项目引用的属性。确保任何引用都使用比 2.0 更新的 .NET。我有一个项目在同一解决方案中引用了另一个项目,并且必须使用较新的 .NET 框架目标重新生成依赖项。

请参阅此帖子。

另外,不要忘记像@Alberto所说的那样添加对主项目的Microsoft.CSharp引用。

如果你的项目面向 .Net Core 或 .Net Standard,则可以安装 Microsoft.CSharp NuGet 包来解决此错误,而不是添加引用。