Roslyn在加载项目时忽略丢失的程序集引用

本文关键字:程序集 引用 加载 加载项 项目 Roslyn | 更新日期: 2023-09-27 18:08:15

当Roslyn加载一个缺少汇编引用的项目时,我不知道如何得到一个错误。该引用将在csproj文件中,如下所示:

<ItemGroup>
    <Reference Include="SomeLibrary" />
</ItemGroup>

如果存在SomeLibrary,语义树将被正确加载,类型将在适当的命名空间中。如果SomeLibrary不存在,Roslyn似乎会继续它的快乐之路,并假设所有缺失的类型都存在于全局命名空间中。我如何让Roslyn报告这个错误?

我包含了一些代码片段以获得更多上下文:

MSBuildWorkspace workspace = MSBuildWorkspace.Create();
workspace.LoadMetadataForReferencedProjects = true;
workspace.SkipUnrecognizedProjects = false;
Project project = workspace.OpenProjectAsync("SomeProject.csproj").Result;
// Project loads no problem, even though a referenced assembly is missing...help

Roslyn在加载项目时忽略丢失的程序集引用

Roslyn在加载缺少引用的项目时不会抛出任何错误,这是设计的。作者希望允许用户推断编译器可以识别的任何类型,即使它不能识别所有类型。(这允许IDE功能,如GoToDefinition工作,即使一些引用丢失或无法解决)

如果您想要发现项目中是否存在错误,您可以创建一个编译并获得错误诊断。以您的示例为基础:

Project project = await workspace.OpenProjectAsync("SomeProject.csproj");
var compilation = await project.GetCompilationAsync();
var errors = compilation.GetDiagnostics().Where(n => n.Severity == DiagnosticSeverity.Error);
if(errors.Any())
{
    //Fix your references
}