使用 Microsoft.VisualStudio.LanguageServices 加载项目为 Visual Studio 2017 抛出 System.ArgumentNullException

问题描述

我正在尝试使用 Microsoft.VisualStuio.LanguageServices 枚举解决方案的所有项目。 这对于 VisualStudio 2019 工作正常,但在 VisualStudio 2017 上失败。 我的代码如下-

var workspace= ComponentModel.GetService<Microsoft.VisualStudio.LanguageServices.VisualStudioWorkspace>(); 
var projects = workspace.CurrentSolution.Projects;        

我在第二行遇到异常 -

System.ArgumentNullException: '值不能为空。参数名称:source'

显示了调试项目列表。 我正在使用 2.10.0.0 版本的 Microsoft.VisualStudio.LanguageServices.dll,它与 VS 模块中加载的 dll 相同。 是组装问题吗?我该如何解决这个问题?

解决方法

发生此问题是由于引用的 dll 和 VS2017 的 dll 之间的 Microsoft.CodeAnalysis 版本不匹配。

在模块窗口中可以清楚地看到,VS使用的是Microsoft.VisualStudio.LanguageServices 2.10.0.0,因此我保留了相同版本的引用dll。

在此声明中- var workspace= componentModel.GetService<Microsoft.VisualStudio.LanguageServices.VisualStudioWorkspace>(); 工作区的类型为 Microsoft.VisualStudio.LanguageServices.VisualStudioWorkspace。

但是当我们这样做时 - var projects = workspace.CurrentSolution.Projects;

变量'projects'的类型是IEnumerable

我想,这就是调试值在快速观察中可用但执行失败的原因。

解决方案 - 引用与 VS 引用的版本相同的 dll。