【发布时间】:2020-10-12 10:09:14
【问题描述】:
我正在创建一些 VSIX。 现在,在开始时,我使用 Roslyn 进行一些代码分析并从解决方案中获取所有项目:
async Task AnalyzeCode()
{
foreach (var project in workspace.CurrentSolution.Projects)
await AnalyzeProject(project);
}
async Task AnalyzeProject(Project project)
{
Models.ProjectInfo pi = new Models.ProjectInfo();
pi.FileName = project.FilePath;
pi.Name = project.Name;
pi.Id = project.Id;
projectsInSolution.Add(pi.Name, pi);
foreach(var doc in project.Documents)
await AnalyzeDocument(pi, doc);
}
等等。如您所见,我从 roslyn 的 Project 类中获取 ProjectId。 此 ProjectId 类具有 GUID 类型的字段 Id,我稍后将其保存在设置中。
现在,当用户在解决方案资源管理器中右键单击项目节点时,我必须检查此选定项目的 id 是否是保存在设置中的项目。所以我使用 dte 获取项目 ID:
UIHierarchy solutionExplorer = dte.ToolWindows.SolutionExplorer;
object[] selectedItems = solutionExplorer.SelectedItems as object[];
Guid projectGuid;
if (selectedItems.Length > 0)
{
IVsHierarchy hierarchy;
Project project = (selectedItems[0] as UIHierarchyItem).Object as Project;
solution.GetProjectOfUniqueName(project.FullName, out hierarchy);
if(hierarchy != null)
hierarchy.GetGuidProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ProjectIDGuid, out projectGuid);
}
但问题是从 IVsHierarchy 读取的 projectGuid 与使用 Roslyn 读取的不同。更重要的是,Roslyn 读取的 ProjectId.Id 在每次应用程序启动时都是不同的。当然从 IVsHierarchy 读取的项目 guid 总是相同的,所以它必须是真正有效的项目 guid。
所以问题是 - 应该如何使用 Roslyn 阅读真正有效的项目指南?
【问题讨论】: