【问题标题】:Using System.Dynamic in Roslyn在 Roslyn 中使用 System.Dynamic
【发布时间】:2014-04-04 13:53:15
【问题描述】:

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

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

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

    【讨论】:

    • 是的,这是自引入dynamic 以来所必需的。
    • 如果微软给出了一条错误消息告诉你这会让事情变得容易得多。
    • 我不知道这是否解决了问题,但我将 添加到我的 Views/Web.config 节点中。编译器错误现在消失了。
    • FWIW 添加 Microsoft.CSharp.dll 意味着 var scriptOptions = ScriptOptions.Default.WithReferences("Microsoft.CSharp") 即删除 dll。难倒了我几分钟:)
    • @JonH 所以我们应该将该行添加到 AssemblyInfo.cs 或某处而不是引用 dll?
    【解决方案2】:

    为了使代码在 .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 全部作为字符串使用
    • 要让我的代码在 .net 3.1 中工作,关键是MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("netstandard")).Location)
    【解决方案3】:

    ASP.NET MVC 特定:

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

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

    .NETCore 默认项目已包含 Microsoft.CSharp 引用,但您会收到几乎相同的消息。

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

    【讨论】:

    • 认为它不适用于 2014 年发布的原始问题(尽管想承认它是有帮助的。)不确定在这种情况下 SO 礼仪规定了什么。
    • 公平点 :) 我只是在此处添加它,因为它看起来很晦涩,这与该错误非常匹配
    【解决方案4】:

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

    看到这个post

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 您的 Roslyn 编译器必须引用 Microsoft CSharp。它是可用的,也可以作为对调用者项目的正常引用添加。请记住 Roslyn 在引用的属性中使用 set Copy Local = true ,否则您生成的代码找不到它。然后将 MetadataReference.CreateFromFile(Assembly.Load(new AssemblyName("Microsoft.CSharp")).Location) 添加到 references[] 以将其添加到您的 compiland。
      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 2014-09-15
      • 2015-06-08
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多