编译CompilationUnitSyntax的正确方法

时间:2017-01-02 00:42:11

标签: c# roslyn

我有以下代码段

 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();

然而,当我直接从编译单元使用SyntaxTree时,我似乎无法使用Roslyn编译它 - 就像那样

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

我找不到比使用

重新创建SyntaxTree更好的方法
CSharpSyntaxTree.ParseText(compilationUnit.ToFullString())

并将其传递给CSharpCompilation.Create方法。有没有更好的方法来编译CompilationUnitSyntax?

2 个答案:

答案 0 :(得分:4)

从语法树创建编译的方式没有任何问题。问题在于您创建语法树的方式,特别是void关键字(由错误指示)。

如果你写这段代码:

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

然后它就会报告错误。

您可以手动为ParseTypeName类型创建TypeName对象,而不是void

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)
);

答案 1 :(得分:0)

您正在寻找CSharpSyntaxTree.Create(compilationUnit)