我有一个 sln 文件中的项目 GUID 列表。
我需要以编程方式找到与每个 GUID 对应的项目。
我怎样才能做到这一点?
项目 GUID 与 .sln 文件中的项目名称一起存储,如下所示:
Project("{Project Type GUID}") = "MyProject",
"Source\MyProject\MyProject.vbproj",
"{AB5BA87B-77D5-4812-B02C-9B4FB87F4EF6}" EndProject
从理论上讲,您可以预先解析解决方案文件并构建 Project-To-GUID 关联的映射。建立该映射后,您应该能够很容易地将对项目 GUID 的任何引用替换为实际项目名称。
注意:您在项目文件中看到的第一个 GUID 是项目类型,而不是实际项目。这有助于 Visual Studio 在打开和使用文件时管理要使用的模板。在这种情况下,您想要的是{AB5BA87B-77D5-4812-B02C-9B4FB87F4EF6}。
所有 Visual Studio 设置都驻留在注册表中,键值如下:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\[Version]
版本可以是“9.0”(VS 2008)、“10.0”(VS 2010)、“11.0”(VS 2012),但也可以是其他任何版本,因为 Visual Studio 可以使用自定义的“hive”键启动(参见devenv.exe 命令行的 /RootSuffix 参数)。
因此,对于正常操作,项目指南位于此处:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\[Version]\Projects
Visual Studio 中的项目可以是标准项目(C#、VB.NET 等)或聚合项目(WPF“风格”优于 C# 或 VB.NET)。
通常,项目有一个“包”键,其中包含包含项目类型的 Visual Studio 包(二进制文件)的 guid。
包描述可以在这里找到:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\[Version]\Packages
本机包(C#、VB.NET、C++、...)作为本机 COM 服务器实现,路径在InprocServer32
密钥中定义。托管包将 MSCOREE.DLL 定义为InprocServer32
键,还有一个CodeBase
键是包不在 GAC 中,Assembly
如果包在 GAC 中,则只有一个键。
我可能回答这个问题很晚了,但希望能帮助任何想知道这个问题的人。您想使用几个程序集来解析 C# 中的解决方案和项目文件,它们是:
Microsoft.Build.Evaluation
和
Microsoft.Build.Construction
在后面的程序集中有一个名为SolutionFile
. 文档。在文档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;
我希望这对您或其他任何人都有帮助。