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.