我目前正在netstandard2.0
库中使用Roslyn构建一个C#源代码生成器。在.csproj
中,我引用了以下Roslyn包:
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.0.1" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.3" />
</ItemGroup>
源代码生成器使用Roslyn的SyntaxFactory
来创建额外的代码。然后,它使用context.Compilation.AddSyntaxTrees()
将生成的代码添加到编译中(context
是传递给生成器的Execute
方法的GeneratorExecutionContext
(。
问题是,我在调用AddSyntaxTrees()
时得到以下异常:
System.ArgumentException:语言版本不一致。参数名称:syntaxTrees
我了解异常的原因。由SyntaxFactory
创建的语法树的语言版本设置为CSharp10
。但是编译上下文的语言版本被设置为CSharp8
。
有没有办法告诉SyntaxFactory
它应该产生的语言版本?
我知道我也可以使用Microsoft.CodeAnalysis.Analyzers
的3.7版本(根据此表(。但这是否也会阻止我使用最新的Roslyn功能(不过不确定这可能是什么(。此外,我如何确保使用源代码生成器的目标库只能使用相同的语言版本进行编译?或者,对于不同的语言版本,我需要不同版本的源生成器吗?此外,在不同的IDE中,这可能会有所不同吗?
创建SyntaxTree时,可以使用ParseOptions参数设置其语言版本。
var options = CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp8);
var syntaxTree = SyntaxFactory.SyntaxTree(root, options);
SyntaxFactory.SyntaxTree
如果您想在用代码创建的语法树中指定LanguageVersion,可以使用以下方法:
var options = CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp10);
var syntaxTree = CSharpSyntaxTree.ParseText(code, options);