【问题标题】:Roslyn and ProjectId - not unique (implementing VSIX)Roslyn 和 ProjectId - 不是唯一的(实现 VSIX)
【发布时间】: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 阅读真正有效的项目指南?

【问题讨论】:

    标签: c# roslyn vsix envdte


    【解决方案1】:

    ProjectId 中的 GUID 是我们每次加载项目时生成的 GUID。这也有点古怪,因为在一个针对多个框架的项目的情况下,您将为每个框架都有一个单独的 Id 和 GUID,即使它是 Visual Studio 其他部分的定义的单个“项目”。

    如果您将 Workspace 转换为 VisualStudioWorkspace,您可以使用更多方法。它看起来像我们的 convenient method to just fetch the GUID directly is internal(哎呀!),但您可以调用 VisualStudioWorkspace.GetHierarchy,以这种方式给它 Roslyn ProjectId,然后像在第二个 sn-p 中那样调用 GetGuidProperty。

    还应用标准警告,即无法在后台线程上可靠地调用 GetGuidProperty 而不会冒死锁的风险,因此,如果您不熟悉线程指南,请小心。我承认,从您的问题来看,项目 GUID 是否是首先使用的正确东西并不完全清楚......

    【讨论】:

    • 是的,它有效。我需要存储这个 guid,因为在某些地方我必须搜索特定的项目。我无法使用项目文件名或项目名称,因为它们可以更改。
    • @AdamJachocki:我忘了问:你是在 Visual Studio 的会话之间存储这个,还是只是为了短期存储?
    • 会话之间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多