加载项目时,Roslyn忽略了缺少的程序集引用?

时间:2016-09-22 16:14:23

标签: c# .net reference roslyn

当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

1 个答案:

答案 0 :(得分:2)

Roslyn在加载缺少引用的项目时不会抛出任何错误,这是设计的。作者希望允许用户推断编译器可以找出的任何类型,即使它无法弄清楚所有类型。 (这样即使某些引用丢失或无法解析,GoToDefinition等IDE功能也能正常工作)

如果您要查找项目中是否存在错误,可以创建编译并获取错误诊断。以你的榜样为基础:

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
}