[c#] Roslyn에서 System.Dynamic 사용

어제 출시 된 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어셈블리를 참조해야한다고 생각합니다


답변

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


답변

ASP.NET MVC 관련 :

당신이 넣어 잊어 버린 경우 당신은 MVC 6 컨트롤러에서이 오류를 얻을 수 있습니다 [FromBody]A의 POST방법.

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

.NETCore 기본 프로젝트에는 이미 다음이 포함되어 있습니다. Microsoft.CSharp 참조 있지만 거의 동일한 메시지가 표시됩니다.

[FromBody]추가 이제 JSON을 게시 한 후 바로 동적 속성에 액세스 할 수 있습니다 🙂


답변

모든 프로젝트 참조의 속성을 확인할 수도 있습니다. 참조가 2.0보다 새로운 .NET을 사용하고 있는지 확인하십시오. 동일한 솔루션에서 다른 프로젝트를 참조하는 프로젝트가 있으며 최신 .NET 프레임 워크 대상을 사용하여 종속성을 다시 빌드해야했습니다.

게시물 보기 .

또한 Microsoft.CSharp@Alberto가 말한 것처럼 주요 프로젝트에 대한 참조를 추가하는 것을 잊지 마십시오 .


답변

프로젝트가 .Net Core 또는 .Net Standard를 대상으로하는 경우 참조를 추가하는 대신 Microsoft.CSharp NuGet 패키지를 설치 하여이 오류를 해결할 수 있습니다 .


답변