VSアドインまたはDXCoreプラグインのソリューション/プロジェクトファイルのリストを取得する
-
07-07-2019 - |
質問
Visual Studioのアドインを作成しようとしていますが、これは特にVisual Studioソリューションのすべてのファイルを追跡する必要があります。サブスクライブする必要があるイベント(ソリューションが開かれたとき、ファイルが追加/削除/編集されたとき、プロジェクトでも同じなど)を知っていますが、実際にファイルのリストを取得する方法がわかりませんいずれかから。
最近CodeRushをインストールし、DXCoreフレームワークで遊んでいます。プラグインでのアプローチには非常に満足していますが、ソリューション内のファイルのリストを取得する明白な方法はまだ見当たりません。
要約すると: Visual Studio SDK または DXCoreを使用して、ソリューションおよびそのプロジェクト内の信頼できるファイルのリストを取得する方法
解決
これはすべて、Visual Studio SDKのDTEを使用して簡単に利用できます。
プロジェクトインターフェース。
ProjectItem インターフェース。
詳細については、プロジェクトとソリューションの制御。
他のヒント
ありがとう、リード。あなたがリンクした記事は、概念実証を数分で解き明かすのに十分なほど私を助けてくれました。
関連していると思うので、ProjectItemを収集するための反復および再帰的手段を以下に示します。これはDXCoreで行いましたが、同じアイデアが生のVisual Studio SDKに適用されます(DXCoreはSDKの見栄えの良いラッパーです)。 「Solution」、「Projects」、「Project」、および「ProjectItem」オブジェクトはEnvDTEにあります。
プロジェクトの設定
EnvDTE.Solution solution = CodeRush.ApplicationObject.Solution;
EnvDTE.Projects projects = solution.Projects;
プロジェクトを繰り返してProjectItemsをプルする
var projects = myProjects.GetEnumerator();
while (projects.MoveNext())
{
var items = ((Project)projects.Current).ProjectItems.GetEnumerator();
while (items.MoveNext())
{
var item = (ProjectItem)items.Current;
//Recursion to get all ProjectItems
projectItems.Add(GetFiles(item));
}
}
最後に、アクティブなソリューション内のすべてのProjectItemを取得するための再帰
ProjectItem GetFiles(ProjectItem item)
{
//base case
if (item.ProjectItems == null)
return item;
var items = item.ProjectItems.GetEnumerator();
while (items.MoveNext())
{
var currentItem = (ProjectItem)items.Current;
projectItems.Add(GetFiles(currentItem));
}
return item;
}
EnvDTE:すべてのプロジェクトの取得(SolutionFolder PITA)
このソリューションは、プロジェクトがサブフォルダーにある場合でも、ソリューション内のすべてのプロジェクトを取得するために見事に機能します。
コードの下のコメントを必ず読んでください。重要な修正を示しているため、これを使用して元のコードの代わりにDTE2を取得します。そうしないと、Visual Studioの正しいインスタンスを取得できません。
DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;
(上記の修正を含むようにコードが更新されました)