【问题标题】:Given Project GUID, how can I find the name/path of the project?给定项目 GUID,我如何找到项目的名称/路径?
【发布时间】:2012-09-10 14:39:33
【问题描述】:

我有一个来自 sln 文件的项目 GUID 列表。

我需要以编程方式找到每个 GUID 对应的项目。

我该怎么做?

【问题讨论】:

  • 您的程序是否在 Visual Studio 的进程内运行?作为一个包?作为加载项?你已经有什么对象了?
  • 我正在尝试从 sln 文件中提取项目依赖项。我解析了相同的 sln 文件,并得到了一个项目 GUID 列表,因为这就是 sln 文件中提到的依赖项的方式。现在,我想获取我拥有的所有 GUID 的项目名称/路径并将它们写入文本文件。这能回答你的问题吗?

标签: c# .net solution envdte


【解决方案1】:

项目 GUID 与 .sln 文件中的项目名称一起存储,如下所示:

Project("{Project Type GUID}") = "MyProject",
"Source\MyProject\MyProject.vbproj",
"{AB5BA87B-77D5-4812-B02C-9B4FB87F4EF6}" EndProject

理论上,您可以预先解析解决方案文件并构建项目到 GUID 关联的映射。建立该映射后,您应该能够很容易地将对项目 GUID 的任何引用替换为实际项目名称。

注意:您在项目文件中看到的第一个 GUID 是项目类型,而不是实际项目。这有助于 Visual Studio 在打开和使用文件时管理要使用的模板。在这种情况下,您需要的是 {AB5BA87B-77D5-4812-B02C-9B4FB87F4EF6}

【讨论】:

    【解决方案2】:

    所有 Visual Studio 设置都驻留在注册表中,位于如下键中:

    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\[Version]
    

    版本可以是“9.0”(VS 2008)、“10.0”(VS 2010)、“11.0”(VS 2012),但也可以是其他任何版本,因为 Visual Studio 可以使用自定义“配置单元”启动键(参见 devenv.exe 命令行的 /RootSuffix 参数)。

    因此,对于正常操作,项目 guid 位于此处:

    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\[Version]\Projects
    

    Visual Studio 中的项目可以是标准项目(C#、VB.NET 等)或聚合项目(WPF “风格”优于 C# 或 VB.NET)。

    通常,项目有一个“Package”键,其中包含包含项目类型的 Visual Studio 包(二进制文件)的 guid。

    可在此处找到软件包说明:

    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\[Version]\Packages
    

    本机包(C#、VB.NET、C++、...)作为本机 COM 服务器实现,路径在 InprocServer32 键中定义。托管包将 MSCOREE.DLL 定义为 InprocServer32 键,还有一个 CodeBase 键是包不在 GAC 中,如果包在 GAC 中,则只有一个 Assembly 键。

    【讨论】:

    • 是的。我明白了。但我需要以编程方式获取相应的项目名称。有没有办法做到这一点?
    • @aromore - 某些项目类型(C#、VB.NET)将项目配置存储为 XML,因此您可以打开这些文件(csproj、vbproj)并从那里获取信息,如果这是您的话重来。
    【解决方案3】:

    我可能回答这个问题很晚了,但希望能帮助任何想知道这个问题的人。您想使用几个程序集来解析 C# 中的解决方案和项目文件,它们是:

    Microsoft.Build.Evaluation
    

    Microsoft.Build.Construction
    

    在后面的程序集中有一个名为SolutionFile 的类。 Documentation。在文档SolutionFile 中包含属性ProjectsByGuid,如果您已经拥有GUID,您可以对其进行linq 查询。执行此操作的代码如下所示:

    var guid = "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"
    var pathToSolutionFile = "C:\users\user\source\repos\solution\solution.sln"
    var sln = SolutionFile.Parse(pathToSolutionFile);
    var projectName = sln.ProjectsByGuid.Where(x => x.key==guid)
                         .FirstOrDefault().Value?.projectname;
    

    我希望这对您或其他任何人都有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 2014-05-21
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 2016-07-05
      相关资源
      最近更新 更多