当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
答案 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
}