如何为新创建的工作区指定 TargetFramework?

How to specify TargetFramework for a newly created Workspace?

我即将为我的 Roslyn 代码分析器及其代码修复程序创建测试。我正在使用生成的测试项目模板,其中包含许多预定义的方法来应用和验证代码修复。

但是,我的分析器的代码修复程序会将 null 替换为 default。默认文字仅在 C# 7.1 中添加,但生成的测试辅助方法创建的默认项目使用 C# 7.0,因此我的测试总是失败。我不想更改我的分析器以使用 default(<type>)(实际上有些情况下分析器不知道类型)。

生成的方法是这样创建一个带有项目的新工作区的:

var solution = new AdhocWorkspace()
    .CurrentSolution
    .AddProject(projectId, TestProjectName, TestProjectName, language)
    .AddMetadataReference(projectId, CorlibReference)
    .AddMetadataReference(projectId, SystemCoreReference)
    .AddMetadataReference(projectId, CSharpSymbolsReference)
    .AddMetadataReference(projectId, CodeAnalysisReference);

我不知道如何在那里指定 .NET 目标框架版本。在 .csproj 文件中,我们添加此标记:

<TargetFramework>net472</TargetFramework>

如何使用 Roslyn 代码分析器执行相同的操作?

您需要添加自定义解析选项以选择不同的语言版本。 WithProjectParseOptions应该做你想做的。

var solution = new AdhocWorkspace()
    .CurrentSolution
    .AddProject(projectId, TestProjectName, TestProjectName, language)
    .AddMetadataReference(projectId, CorlibReference)
    .AddMetadataReference(projectId, SystemCoreReference)
    .AddMetadataReference(projectId, CSharpSymbolsReference)
    .AddMetadataReference(projectId, CodeAnalysisReference)
    .WithProjectParseOptions(projectId, new CSharpParseOptions(LanguageVersion.CSharp7_1));