Roslyn에서 System.Dynamic 사용


96

어제 출시 된 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);
}

답변:


219

Microsoft.CSharp.dll어셈블리를 참조해야한다고 생각합니다


3
네, 이것은 dynamic도입 된 이후 로 필요한 것입니다 .
— khellang 2014

19
그리고 만약 마이크로 소프트가 오류 메시지를 주면 이것이 훨씬 더 쉬워 질 것입니다.
— kjbartel 2015 년

1
이 문제가 해결되었는지 여부는 모르겠지만 <add namespace = "Microsoft.CSharp"/>를 내 Views / Web.config <namespaces> 노드에 추가했습니다. 이제 컴파일러 오류가 사라졌습니다.
— Don Rolling

3
Microsoft.CSharp.dll을 추가하는 FWIW는 var scriptOptions = ScriptOptions.Default.WithReferences ( "Microsoft.CSharp") 즉, dll을 삭제하는 것을 의미합니다. 몇 분 동안 저를 당황하게했습니다. :)
— Jon H

@JonH 그래서 우리는 dll을 참조하는 대신 AssemblyInfo.cs 또는 어딘가에 해당 줄을 추가해야 합니까?
— NH.

9

.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 멀리 얻을 수 있습니다
— 사이먼 Mourier에게

7

ASP.NET MVC 관련 :

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

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

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

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


2014 년에 게시 된 원래 질문에는 적용되지 않는다고 생각했습니다 (도움이되었음을 인정하고 싶었습니다.) 그러한 상황에서 SO 에티켓이 무엇을 지시하는지 확신 할 수 없었습니다.
— tj

난 그냥 너무 모호 보였다 때문에 여기에 추가하고이 해당 오류에 대한 좋은 경기였다 :) 페어 점
— Simon_Weaver

4

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

이 게시물 보기 .

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


1

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.