2017-01-02 15 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.Createメソッドにそれを歌います。 CompilationUnitSyntaxをコンパイルするための良い方法はありますか?

+0

最初の例のようにコンパイルするとどのような問題が発生しますか? –

+0

@Oleg Bogdanov 'CS1547:キーワード 'void'はこのコンテキストでは使用できません。 – randomuser

+0

どの行にありますか?このエラーは完全に無関係です。 –

答えて

1

を探しています。この問題は構文ツリーの作成方法、具体的にはvoidキーワード(エラーが示すとおり)にあります。

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

が、それはすでにエラーを報告します:あなたはこのコードを記述する場合

代わりのParseTypeName、手動voidタイプにTypeNameオブジェクトを作成することができます。私の作品

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

全コード(不要な構文ノードを削除するために、あなたのコードから簡略化されている):

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

私はこの動作が予期せぬため、[Roslyn repo(https:// github。 com/dotnet/roslyn/issues/16191)。 – svick

0

あなたは構文木からコンパイルを作成する方法と間違って何もないCSharpSyntaxTree.Create(compilationUnit)

+0

動作していないようです。私はまだコンパイルエラーを受けています 'CS1547:キーワード 'void'はこのコンテキストでは使用できません。 – randomuser