C#でソリューション内のすべてのプロジェクト名を取得する方法は? このソリューションには、多くのWindowsサービスがあるコンソールプロジェクトがあります。ソリューション内のすべてのプロジェクト名を取得する方法は?
私の目標は、すべてのプロジェクト名を見つけて、プロジェクト内のすべてのWindowsサービス名を取得することです。
このインプリメンテーションは、同じソリューション内の新しいプロジェクトで実行されます。 ヒントありがとうございます。
C#でソリューション内のすべてのプロジェクト名を取得する方法は? このソリューションには、多くのWindowsサービスがあるコンソールプロジェクトがあります。ソリューション内のすべてのプロジェクト名を取得する方法は?
私の目標は、すべてのプロジェクト名を見つけて、プロジェクト内のすべてのWindowsサービス名を取得することです。
このインプリメンテーションは、同じソリューション内の新しいプロジェクトで実行されます。 ヒントありがとうございます。
照会を解決するMSDNを確認してください。
の.slnファイルには、永続データとそれが参照 プロジェクトVSPackagesの名前と値のパラメータを見つけ、ロード に環境を使用して、テキストベースの情報が含まれています。ユーザーがソリューションを開くとき、 環境は、.Slnファイル内のpreSolution、Project、およびpostSolution 情報を循環して、ソリューション、 ソリューション内のプロジェクト、およびソリューションに添付された永続的な情報をロードします。
EnvDTE : Getting all projectsもチェックしてください。また
(そんな素敵な答えを提供するためのジョンLeidegrenへのフルクレジット)このThreadをチェック
public class Solution
{
//internal class SolutionParser
//Name: Microsoft.Build.Construction.SolutionParser
//Assembly: Microsoft.Build, Version=4.0.0.0
static readonly Type s_SolutionParser;
static readonly PropertyInfo s_SolutionParser_solutionReader;
static readonly MethodInfo s_SolutionParser_parseSolution;
static readonly PropertyInfo s_SolutionParser_projects;
static Solution()
{
s_SolutionParser = Type.GetType("Microsoft.Build.Construction.SolutionParser, Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", false, false);
if (s_SolutionParser != null)
{
s_SolutionParser_solutionReader = s_SolutionParser.GetProperty("SolutionReader", BindingFlags.NonPublic | BindingFlags.Instance);
s_SolutionParser_projects = s_SolutionParser.GetProperty("Projects", BindingFlags.NonPublic | BindingFlags.Instance);
s_SolutionParser_parseSolution = s_SolutionParser.GetMethod("ParseSolution", BindingFlags.NonPublic | BindingFlags.Instance);
}
}
public List<SolutionProject> Projects { get; private set; }
public Solution(string solutionFileName)
{
if (s_SolutionParser == null)
{
throw new InvalidOperationException("Can not find type 'Microsoft.Build.Construction.SolutionParser' are you missing a assembly reference to 'Microsoft.Build.dll'?");
}
var solutionParser = s_SolutionParser.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic).First().Invoke(null);
using (var streamReader = new StreamReader(solutionFileName))
{
s_SolutionParser_solutionReader.SetValue(solutionParser, streamReader, null);
s_SolutionParser_parseSolution.Invoke(solutionParser, null);
}
var projects = new List<SolutionProject>();
var array = (Array)s_SolutionParser_projects.GetValue(solutionParser, null);
for (int i = 0; i < array.Length; i++)
{
projects.Add(new SolutionProject(array.GetValue(i)));
}
this.Projects = projects;
}
}
[DebuggerDisplay("{ProjectName}, {RelativePath}, {ProjectGuid}")]
public class SolutionProject
{
static readonly Type s_ProjectInSolution;
static readonly PropertyInfo s_ProjectInSolution_ProjectName;
static readonly PropertyInfo s_ProjectInSolution_RelativePath;
static readonly PropertyInfo s_ProjectInSolution_ProjectGuid;
static SolutionProject()
{
s_ProjectInSolution = Type.GetType("Microsoft.Build.Construction.ProjectInSolution, Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", false, false);
if (s_ProjectInSolution != null)
{
s_ProjectInSolution_ProjectName = s_ProjectInSolution.GetProperty("ProjectName", BindingFlags.NonPublic | BindingFlags.Instance);
s_ProjectInSolution_RelativePath = s_ProjectInSolution.GetProperty("RelativePath", BindingFlags.NonPublic | BindingFlags.Instance);
s_ProjectInSolution_ProjectGuid = s_ProjectInSolution.GetProperty("ProjectGuid", BindingFlags.NonPublic | BindingFlags.Instance);
}
}
public string ProjectName { get; private set; }
public string RelativePath { get; private set; }
public string ProjectGuid { get; private set; }
public SolutionProject(object solutionProject)
{
this.ProjectName = s_ProjectInSolution_ProjectName.GetValue(solutionProject, null) as string;
this.RelativePath = s_ProjectInSolution_RelativePath.GetValue(solutionProject, null) as string;
this.ProjectGuid = s_ProjectInSolution_ProjectGuid.GetValue(solutionProject, null) as string;
}
}
これは、スレッドのソリューションを使用するには、新しいRoslyn API
var workspace=MSBuildWorkspace.Create();
var solution = workspace.OpenSolutionAsync(solutionPath).Result;
var projects = solution.Projects;
foreach(var project in projects)
{
//TODO
}
を使用して容易になりますMicrosoft.VisualStudio.Shell.Interopを使用する必要があります。私はVisual Studio 2012でそれを見つけることができません。 –
それはVisual Studio 2012にあります。これを確認してください: - http://msdn.microsoft.com/en-us/library/bb164686.aspx –
なぜrepost [別のStackOverflowの答え](http://stackoverflow.com/a/4634505/1810243)あなた自身の答えで...たとえあなたがクレジットを与えても。 – MikeSmithDev