我有以下代码段
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?
答案 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)