2012-09-10 59 views
2

我有一个sln文件中的项目GUID列表。鉴于项目GUID,我如何找到项目的名称/路径?

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

我该怎么做?

+1

您的程序是否与Visual Studio一起在进程中运行?作为一个包?作为加载项?你有什么目标? –

+0

我想从sln文件中提取项目依赖关系。 我解析了sln文件,得到了一个Project GUID列表,因为这就是在sln文件中提到依赖关系的方式。 现在,我想获取所有GUID的项目名称/路径并将它们写入文本文件。 这是否回答你的qn? – aromore

回答

1

所有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密钥。

+0

是的。我明白了。 但我需要以编程方式获取相应的项目名称。 有没有办法做到这一点? – aromore

+0

@aromore - 某些项目类型(C#,VB.NET)将项目配置存储为XML,因此您可以打开这些文件(csproj,vbproj)并从那里获取信息,如果这就是您的想法。 –

1

项目的GUID沿侧存储项目名称.sln文件内像这样:

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

理论上你可以preparse解决方案文件,并建立地图项目到GUID协会。一旦建立了该地图,您应该可以很容易地用实际项目名称替换项目GUID的任何引用。

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

0

我可能会很迟才回答这个问题,但希望能帮助其他任何想知道这个问题的人。有几个组件,你想用在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; 

我希望这可以帮助你,或其他任何人。

相关问题