Roslyn'de System.Dynamic'i kullanma


96

Dinamik ve ExpandoObject kullanmak için dün yayınlanan Roslyn'in yeni sürümüyle gelen örneği değiştirdim ancak nasıl düzelteceğimi bilmediğim bir derleyici hatası alıyorum. Hata şudur:

(7,21): CS0656 hatası: Eksik derleyici gerekli üyesi 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

Yeni derleyicide henüz dinamikleri kullanamıyor musunuz? Bunu nasıl düzeltebilirim? İşte güncellediğim örnek:

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

Yanıtlar:


219

Ben başvurabileceğiniz gerektiğini düşünüyorum Microsoft.CSharp.dllmontaj


3
Evet, dynamictanıtıldığından beri gerekli olan şeyler bunlar .
khellang

19
Ve eğer Microsoft size bunun işleri çok daha kolay hale getireceğini söyleyen bir hata mesajı verirse.
kjbartel

1
Bunun sorunu çözüp çözmediğini bilmiyorum, ancak Görünümler / Web.config <ad alanları> düğümüme <add namespace = "Microsoft.CSharp" /> ekledim. Derleyici hatası artık ortadan kalktı.
Don Rolling

3
FWIW, Microsoft.CSharp.dll'nin eklenmesi, var scriptOptions = ScriptOptions.Default.WithReferences ("Microsoft.CSharp") anlamına gelir, yani dll'yi bırakın. Beni birkaç dakikalığına şaşırttı :)
Jon H

@JonH, öyleyse bu satırı dll'ye referans vermek yerine AssemblyInfo.cs'ye veya başka bir yere eklemeliyiz ?
NH.

9

Kodun .Net Core 2.1'de çalışması için derlemeye şu referansları eklemem gerekiyordu:

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 ve Microsoft.CSharp ile, tümü dizge olarak kurtulabilirsiniz
Simon Mourier

7

ASP.NET MVC'ye özel:

[FromBody]Bir POSTyöntem koymayı unutursanız, bu hatayı bir MVC 6 denetleyicisinde alabilirsiniz .

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

.NETCore varsayılan projesi zaten Microsoft.CSharpreferans içeriyor ancak hemen hemen aynı mesajı alıyorsunuz.

İle [FromBody]eklenen artık JSON gönderebilir ve sonra sadece dinamik özelliklere erişebilirsiniz :-)


Bunun 2014'ten gönderilen orijinal soru için geçerli olmadığını anladım (ancak yararlı olduğunu kabul etmek istedim.) Böyle bir durumda SO görgü kurallarının ne dikte ettiğinden emin değildim.
tj

Doğru nokta :) Onu buraya ekledim çünkü çok belirsiz görünüyordu ve bu bu hata için iyi bir eşleşme oldu
Simon_Weaver

4

Ayrıca tüm proje referanslarınızın özelliklerini de kontrol etmek isteyebilirsiniz. Herhangi bir başvurunun 2.0'dan daha yeni .NET kullandığından emin olun. Aynı çözümde başka bir projeye başvuran ve daha yeni bir .NET çerçeve hedefi kullanarak bağımlılığı yeniden oluşturmak zorunda olan bir projem var.

Bu gönderiye bakın .

Ayrıca Microsoft.CSharp@Alberto'nun dediği gibi ana projenize referans eklemeyi unutmayın .


1

Projeniz .Net Core veya .Net Standard'ı hedefliyorsa, referans eklemek yerine bu hatayı çözmek için Microsoft.CSharp NuGet paketini yükleyebilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.