C# 如何将其他文件添加到特别的Roslyn工作区,以将其公开给分析器

C# 如何将其他文件添加到特别的Roslyn工作区,以将其公开给分析器,c#,roslyn,C#,Roslyn,我正在创建一些Roslyn分析器,它们使用AdditionFiles功能访问设置文件。我正在尝试测试分析仪是否正确使用此选项 我有一种方法可以设置一个临时测试工作区,我尝试通过两种途径添加其他文档: private static Project CreateProject(IEnumerable<string> sources) { var projectId = ProjectId.CreateNewId(TestProjectName); var solutio

我正在创建一些Roslyn分析器,它们使用
AdditionFiles
功能访问设置文件。我正在尝试测试分析仪是否正确使用此选项

我有一种方法可以设置一个临时测试工作区,我尝试通过两种途径添加其他文档:

private static Project CreateProject(IEnumerable<string> sources)
{
    var projectId = ProjectId.CreateNewId(TestProjectName);

    var solution = new AdhocWorkspace()
        .CurrentSolution
        .AddProject(projectId, TestProjectName, TestProjectName, LanguageNames.CSharp)
        .AddMetadataReference(projectId, CorlibReference)
        .AddMetadataReference(projectId, SystemCoreReference)
        .AddAdditionalDocument(DocumentInfo.Create(DocumentId.CreateNewId(projectId),
                                                    "arnolyzer.yaml",
                                                    filePath: @"..\..\arnolyzer.yaml"));

    var count = 0;
    foreach (var source in sources)
    {
        var newFileName = $"{DefaultFilePathPrefix}{count++}.{CSharpDefaultFileExt}";
        var documentId = DocumentId.CreateNewId(projectId, newFileName);
        solution = solution.AddDocument(documentId, newFileName, SourceText.From(source));
    }
    var settingsFileId = DocumentId.CreateNewId(projectId, "arnolyzer.yaml");
    solution = solution.AddAdditionalDocument(settingsFileId, "arnolyzer.yaml", SourceText.From(@"..\..\arnolyzer.yaml"));
    return solution.GetProject(projectId);
}
private static Project CreateProject(IEnumerable sources)
{
var projectId=projectId.CreateNewId(TestProjectName);
var solution=new AdhocWorkspace()
.当前解决方案
.AddProject(projectId、TestProjectName、TestProjectName、LanguageNames.CSharp)
.AddMetadataReference(projectId,CorlibReference)
.AddMetadataReference(projectId,SystemCoreReference)
.AddAdditionalDocument(DocumentInfo.Create(DocumentId.CreateNewId(projectId)),
“阿诺利泽,亚马尔”,
文件路径:@“.\..\arnolyzer.yaml”);
var计数=0;
foreach(源中的var源)
{
var newFileName=$“{DefaultFilePathPrefix}{count++}.{CSharpDefaultFileExt}”;
var documentId=documentId.CreateNewId(projectId,newFileName);
solution=solution.AddDocument(documentId,newFileName,SourceText.From(source));
}
var settingsFileId=DocumentId.CreateNewId(projectId,“arnolyzer.yaml”);
solution=solution.AddAdditionalDocument(设置文件ID,“arnolyzer.yaml”,SourceText.From(@.\..\arnolyzer.yaml));
返回解决方案.GetProject(projectId);
}
通过检查
项目
实例,我可以看到添加了两个附加文档

但是,在检查
AnalysisContext.Options.AdditionalFiles
中的
compilestartananalysiscontext.registercompilestartaction
操作时,
AdditionalFiles
为空


有人知道这种方法是否有效,以及我在哪里出了问题吗?或者,添加到
项目中的附加文档是否与
AditionalFiles
功能无关

这不会直接回答您的问题,但您提到您正在尝试测试分析器是否使用附加文件。下面是我们解决这个问题的方法:

var compilationWithAnalyzer = compilation.WithAnalyzers(
  diagnosticAnalyzers,
  new AnalyzerOptions(ImmutableArray.Create<AdditionalText>(new AnalyzerAdditionalFile(configuration.Path))),
  tokenSource.Token);
var diagnostics = await compilationWithAnalyzer.GetAnalyzerDiagnosticsAsync();

回答您的简单问题:是的,AdditionalDocument与编译器AdditionalFiles功能相匹配。看起来你要添加两次文件?另外,我不确定我们是否支持文件名中的相对路径,如果您将其更改为完整路径呢?@JasonMalinowski。我通过两种方法添加文件两次,以测试一种方法是否有效,另一种方法是否有效。我尝试了完整的路径,但不幸的是,没有什么不同。塔马斯在回答中使用的方法对我来说很有效,所以我会使用它。谢谢。不过你可能还是希望在上提交一个bug;要么这样做不应该失败,要么至少需要一些更新过的文档。@JasonMalinowski,好主意,Jason,我将尝试构建一个最小的项目来演示这个问题,并将其作为bug提交。谢谢。这似乎是这个问题:谢谢塔马斯,这个方法对我来说是正确的。我的问题现在解决了。但是我采取的奇怪的方法没有奏效。
public sealed class AnalyzerAdditionalFile : AdditionalText
{
  private readonly string path;

  public AnalyzerAdditionalFile(string path)
  {
    this.path = path;
  }

  public override string Path => path;

  public override SourceText GetText(CancellationToken cancellationToken)
  {
    return SourceText.From(File.ReadAllText(path));
  }
}