2017-01-02 4 views
1

내가 코드 그러나적절한 방법

var compilationUnit = SyntaxFactory.CompilationUnit() 
      .AddUsings(SyntaxFactory.UsingDirective(SyntaxFactory.ParseName("System"))) 
      .AddMembers(
       SyntaxFactory.NamespaceDeclaration(SyntaxFactory.IdentifierName("MyNamespace")) 
        .AddMembers(SyntaxFactory.ClassDeclaration("MyClass").AddMembers(
         SyntaxFactory.MethodDeclaration(SyntaxFactory.ParseTypeName("void"), "Main") 
          .WithBody(SyntaxFactory.Block())))).NormalizeWhitespace(); 

다음 한 CompilationUnitSyntax을 컴파일하려면, 내가 컴파일 단위에서 SyntaxTree를 사용할 때 직접 로슬린로 컴파일 할 수없는 것

CSharpSyntaxTree.ParseText(compilationUnit.ToFullString()) 

및 pas를 ​​사용하여 SyntaxTree를 다시 생성하는 것보다 나은 것을 찾을 수 없습니다. 그것을 CSharpCompilation에 노래하십시오. 방법을 창조하십시오. CompilationUnitSyntax를 컴파일하는 더 좋은 방법이 있습니까?

+0

첫 번째 예와 같이 컴파일 할 때 어떤 문제가 발생합니까? –

+0

@Oleg Bogdanov'CS1547 : 'void'는이 컨텍스트에서는 사용할 수 없습니다. ' – randomuser

+0

어떤 줄에 있습니까? 이 오류는 완전히 부적절한 것 같습니다. –

답변

1

찾고 있습니다. 문제는 구문 트리를 만드는 방법에 있으며 특히 void 키워드 (오류로 표시됨)입니다.

SyntaxFactory.ParseTypeName("void").GetDiagnostics() 

는 그 다음 이미 오류를보고합니다 :이 코드를 작성하는 경우

.

SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword)) 

전체 코드 (불필요한 구문 노드를 제거하는 코드에서 단순화되는) 나를 위해 작동 :

대신 ParseTypeName

, 당신은 수동으로 void 유형에 대한 TypeName 개체를 만들 수 있습니다

var compilationUnit = SyntaxFactory.CompilationUnit() 
    .AddMembers(SyntaxFactory.ClassDeclaration("MyClass").AddMembers(
     SyntaxFactory.MethodDeclaration(
       SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.VoidKeyword)), 
       "Main") 
      .WithBody(SyntaxFactory.Block()))) 
    .NormalizeWhitespace(); 

CSharpCompilation compilation = CSharpCompilation.Create(
    assemblyName: "MyAssembly", 
    syntaxTrees: new[] { compilationUnit.SyntaxTree }, 
    references: references, 
    options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) 
); 
+0

BTW, 예상치 못한 동작으로 인해 [Roslyn repo에서 문제가 발생했습니다.] (https : // github. com/dotnet/roslyn/issues/16191). – svick

0

당신은 당신이 구문 트리에서 편집을 작성하는 방식에 문제가 거기에 아무것도 CSharpSyntaxTree.Create(compilationUnit)

+0

작동하지 않는 것 같습니다. 아직 컴파일 오류가 발생합니다. 'CS1547 :이 문맥에서 'void'키워드를 사용할 수 없습니다. ' – randomuser