在罗斯林使用System.Dynamic


96

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

Answers:


219

我认为您应该参考Microsoft.CSharp.dll程序集


3
是的,自dynamic引入以来,这是必需的。
khellang 2014年

19
而且,如果Microsoft提供了一条错误消息告诉您,这将使事情变得容易得多。
kjbartel

1
我不知道这是否解决了问题,但是我在我的Views / Web.config <namespaces>节点中添加了<add namespace =“ Microsoft.CSharp” />。编译器错误现在消失了。
Don Rolling

3
FWIW添加Microsoft.CSharp.dll意味着var scriptOptions = ScriptOptions.Default.WithReferences(“ Microsoft.CSharp”),即删除dll。让我难过几分钟:)
乔恩·H

@JonH,所以我们应该将该行添加到AssemblyInfo.cs或某处,而不是引用dll?
NH。

9

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

你可以逃脱System.Linq.Expressions,System.Private.CoreLib,System.Runtime和Microsoft.CSharp,全部为字符串
西蒙Mourier

7

特定于ASP.NET MVC:

如果你忘了把你可以在MVC 6控制器得到这个错误[FromBody]POST方法。

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

.NETCore默认项目已包含Microsoft.CSharp参考,但您几乎得到了相同的消息。

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


认为这不适用于2014年以来发布的原始问题(尽管想承认它是有帮助的。)不确定在这种情况下SO礼节规定了什么。
tj

公平点:)我只是在这里添加了它,因为它似乎太模糊了,这是该错误的很好匹配
Simon_Weaver

4

您可能还需要检查所有项目引用的属性。确保所有引用都使用2.0以后的.NET。我有一个在同一解决方案中引用另一个项目的项目,并且不得不使用较新的.NET框架目标来重建依赖关系。

看到这篇文章

另外,不要忘了添加Microsoft.CSharp对您的主项目的引用,如@Alberto所说。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.