【问题标题】:Roslyn ignores missing assembly references when loading project?Roslyn 在加载项目时忽略缺少的程序集引用?
【发布时间】:2016-09-23 01:10:09
【问题描述】:

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

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

如果 SomeLibrary 存在,语义树将正确加载,并且类型将位于其适当的命名空间中。如果 SomeLibrary 不存在,Roslyn 似乎会继续它的快乐方式,只是假设全局命名空间中存在任何缺失的类型。如何让 Roslyn 报告此错误?

我已经包含了一些代码 sn-ps 以获得更多上下文:

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

【问题讨论】:

  • 我们开始为此创建一个 API,但尚未最终确定,如您所见 here。尽管需要做一些额外的工作才能将其连接到 MSBuildWorkspace。您可以提交错误以至少跟踪请求。
  • 对于编译错误已经存在的项目错误使用相同的 API 怎么样? GetDiagnostics?
  • 我们将它们分开,因为如果有项目错误,则可能意味着编译错误毫无意义,在这种情况下根本不计算它们会便宜很多。
  • 我的意思是在 Project 类中添加一个 GetDiagnostics 方法。如果项目文件中有错误,我想向用户打印有关项目错误的详细信息,而不仅仅是失败而没有错误消息。如果项目中错误的 api 与文档中的错误相同,这也有助于保持一致性。

标签: c# .net reference roslyn


【解决方案1】:

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
}

【讨论】:

  • 非常感谢您的快速有用的回答。这就是我一直在寻找的,感谢您解释此设计背后的原因。
  • 好吧,看来我仍然没有得到缺少的程序集引用。如果正在使用引用的程序集,那么它将报告它找不到类型定义,但是,我无法查看 roslyn 是否能够找到程序集引用。有没有办法做到这一点?
  • 所以看起来 Roslyn 没有用于获取某些项目错误的 API?它可以报告文件中的语义错误,但项目文件中的错误,例如缺少程序集引用,只是被忽略并且没有办法处理它们?
  • 看起来是这样的。缺少引用本身似乎并不被视为错误。当您使用缺少引用的程序集的类型时,它们可能会在项目的其他地方导致错误。
猜你喜欢
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多