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