C# 在Roslyn中使用System.Dynamic

C# 在Roslyn中使用System.Dynamic,c#,roslyn,C#,Roslyn,我修改了昨天发布的新版Roslyn附带的示例,以使用dynamic和ExpandooObject,但我遇到了一个编译器错误,我不知道如何修复。错误是: (7,21):错误CS0656:缺少所需的编译器成员“Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create” 您还不能在新的编译器中使用动力学吗?我怎样才能解决这个问题?以下是我更新的示例: [TestMethod] public void EndToEndCompileAndRun()

我修改了昨天发布的新版Roslyn附带的示例,以使用dynamic和ExpandooObject,但我遇到了一个编译器错误,我不知道如何修复。错误是:

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

我认为您应该引用
Microsoft.CSharp.dll
assembly

您可能还需要检查所有项目引用的属性。 确保所有引用使用的.NET高于2.0。我有一个项目引用了同一解决方案中的另一个项目,必须使用较新的.NET framework目标重新构建依赖关系

看这个


另外,别忘了给你的主要项目添加
Microsoft.CSharp
参考,比如@Alberto said。

ASP.NET MVC特定:

如果您忘记将
[FromBody]
放入
POST
方法中,MVC6控制器中可能会出现此错误

    [HttpPost("[action]")]
    public void RunReport([FromBody]dynamic report)
    {
        ...
    }
.NETCore默认项目已经包含了
Microsoft.CSharp
reference,但您得到的信息基本相同


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

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

如果您的项目的目标是.Net Core或.Net Standard,那么您可以安装NuGet软件包来解决此错误,而不是添加引用。

Yep,这是自从引入
dynamic
以来所需要的一些东西。如果Microsoft给出一条错误消息告诉您,这将使事情变得更简单。我不知道这是否解决了问题,但我将其添加到了我的Views/Web.config节点中。编译器错误现已消失。FWIW添加Microsoft.CSharp.dll意味着var scriptOptions=scriptOptions.Default.WithReferences(“Microsoft.CSharp”)即删除dll。我被难住了几分钟:)@john所以我们应该把这一行添加到AssemblyInfo.cs或其他地方,而不是引用dll?我想这不适用于2014年发布的原始问题(尽管我想承认这是有帮助的)我不确定在这种情况下,礼仪规定了什么。公平点:)我只是在这里添加了它,因为它看起来很模糊,这与错误很匹配。你可以使用System.Linq.Expressions、System.Private.CoreLib、System.Runtime和Microsoft.CSharp,all as Strings要使我的代码在.net 3.1中工作,关键点是
MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName(“netstandard”)))).Location)
Roslyn编译器必须引用Microsoft CSharp。它是可用的,或者可以添加为对调用者项目的常规引用。请记住,对于Roslyn,请在引用的属性中使用set Copy Local=true,否则生成的代码将找不到它。然后将MetadataReference.CreateFromFile(Assembly.Load(新的AssemblyName(“Microsoft.CSharp”))).Location)添加到引用[]以将其添加到编译器中。