Sử dụng System.Dynamic trong Roslyn


96

Tôi đã sửa đổi ví dụ đi kèm với phiên bản Roslyn mới được phát hành ngày hôm qua để sử dụng động và ExpandoObject nhưng tôi đang gặp lỗi trình biên dịch mà tôi không biết cách khắc phục. Lỗi là:

(7,21): lỗi CS0656: Thiếu thành viên yêu cầu trình biên dịch 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

Bạn chưa thể sử dụng động lực học trong trình biên dịch mới? Làm thế nào tôi có thể sửa lỗi này? Đây là ví dụ mà tôi đã cập nhật:

[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âu trả lời:


219

Tôi nghĩ rằng bạn nên tham khảo Microsoft.CSharp.dllhội đồng


3
Đúng, đây là thứ bắt buộc phải có kể từ khi dynamicđược giới thiệu.
khellang

19
Và nếu Microsoft đưa ra một thông báo lỗi cho bạn biết điều này sẽ khiến mọi thứ dễ dàng hơn rất nhiều.
kjbartel

1
Tôi không biết liệu điều này có khắc phục được sự cố hay không, nhưng tôi đã thêm <add namespace = "Microsoft.CSharp" /> vào nút Views / Web.config <namespaces> của mình. Lỗi trình biên dịch hiện đã biến mất.
Don Rolling

3
FWIW thêm Microsoft.CSharp.dll có nghĩa là var scriptOptions = ScriptOptions.Default.WithRefferences ("Microsoft.CSharp") tức là thả dll. Làm tôi bối rối trong vài phút :)
Jon H

@JonH vì vậy chúng ta nên thêm dòng đó vào AssemblyInfo.cs hoặc một nơi nào đó thay vì tham chiếu dll?
NH.

9

Để làm cho mã hoạt động trong .Net Core 2.1, tôi phải thêm tài liệu tham khảo này trong biên dịch:

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

Bạn có thể sử dụng System.Linq.Expressions, System.Private.CoreLib, System.Runtime và Microsoft.CSharp, tất cả đều ở dạng chuỗi
Simon Mourier

7

ASP.NET MVC cụ thể:

Bạn có thể gặp lỗi này trong bộ điều khiển MVC 6 nếu bạn quên đặt [FromBody]một POSTphương thức.

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

Dự án mặc định .NETCore đã bao gồm Microsoft.CSharptham chiếu nhưng bạn nhận được khá nhiều thông báo tương tự.

Với việc [FromBody]thêm vào, giờ đây bạn có thể đăng JSON và sau đó chỉ cần truy cập động vào các thuộc tính :-)


Hình dung rằng nó không áp dụng cho câu hỏi ban đầu được đăng từ năm 2014 (mặc dù muốn thừa nhận rằng nó hữu ích.) Không chắc chắn những gì quy tắc SO quy định trong tình huống như vậy.
tj

Điểm Fair :) Tôi chỉ cần thêm nó ở đây vì nó dường như để che khuất và đây là một trận đấu tốt cho lỗi
Simon_Weaver

4

Bạn cũng có thể muốn kiểm tra các thuộc tính của tất cả các tham chiếu dự án của bạn. Đảm bảo rằng mọi tham chiếu đang sử dụng .NET mới hơn 2.0. Tôi có một dự án đang tham chiếu đến một dự án khác trong cùng một giải pháp và phải xây dựng lại phần phụ thuộc bằng cách sử dụng mục tiêu khung .NET mới hơn.

Xem bài đăng này .

Ngoài ra, đừng quên thêm Microsoft.CSharptài liệu tham khảo cho bạn dự án chính như @Alberto đã nói.


1

Nếu dự án của bạn đang nhắm mục tiêu .Net Core hoặc .Net Standard, thì thay vì thêm tham chiếu, bạn có thể cài đặt gói Microsoft.CSharp NuGet để giải quyết lỗi này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.