簡體   English   中英

在Roslyn中使用System.Dynamic

[英]Using System.Dynamic in 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);
}

我認為你應該引用Microsoft.CSharp.dll程序集

ASP.NET MVC具體:

如果忘記將[FromBody]放在POST方法中,則可以在MVC 6控制器中出現此錯誤。

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

.NETCore默認項目已包含Microsoft.CSharp引用,但您得到的信息幾乎相同。

添加[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),            
    }
);

您可能還想檢查所有項目引用的屬性。 確保任何引用都使用比2.0更新的.NET。 我有一個項目在同一個解決方案中引用另一個項目,並且不得不使用較新的.NET框架目標重建依賴項。

看這篇文章

另外,不要忘記將Microsoft.CSharp引用添加到主項目中,如@Alberto所說。

如果您的項目以.Net Core或.Net Standard為目標,那么您可以安裝Microsoft.CSharp NuGet包來解決此錯誤,而不是添加引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM