2012-09-10 65 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; 

我希望這可以幫助你,或其他任何人。

相關問題