4

プラグインで使用する場合、次のスニペットを使用して VS ソリューション情報を抽出できることを理解しています。

EnvDTE.Solution solution = CodeRush.ApplicationObject.Solution;
EnvDTE.Projects projects = solution.Projects;

Q: コンソール アプリケーションを作成し、これらのファイルの詳細にアクセスしたいと考えています。私の目的は、コンソール アプリケーション (VS なしで実行できる) を作成して、入力 .sln ファイルで見つけた設計上の問題に基づいてレポートを生成することです。これにはどのような関数を使用しますか?

4

1 に答える 1

9

元の (および更新された) 投稿は、ここにあります

実際、DXCore は Visual Studio の外で使用するように設計されていませんが、常に回避策があります... この記事では、通常の C# コンソール アプリケーション内で DXCore フレームワークを使用してソリューション全体を解析し、抽象解析ツリーで作業します。ソリューションは、*.sln ファイルへの完全な完全パスとしてプログラムに引数として渡す必要があります。引数が使用されていない場合、テスト プログラムへのハードコードされたパスが使用されるため、プログラムはそれ自体を解析し、使用されているすべての型のリストや各クラス内のメンバー数など、ソリューションに関する情報を出力します。

新しい C# コンソール アプリケーションを作成し、TestDXCoreConsoleApp という名前を付けて、"C:\Project" フォルダー内に保存します。

新しいコンソール アプリの作成

次に、新しいプロジェクトのターゲット フレームワーク バージョンをフレームワーク 4.0 に変更する必要があります。これは、「ターゲット フレームワーク 4.0 クライアント プロファイル」ではありません。これは、必要なアセンブリ参照の一部がこのバージョンのターゲット フレームワークをサポートしていないためです。

設定対象フレームワーク

次に、必要なアセンブリ参照を追加しましょう。必要なもののリストは次のとおりです。

1) DXCore アセンブリ:

  • DevExpress.CodeRush.Common
  • DevExpress.CodeRush.Core
  • DevExpress.CodeRush.StructuralParser
  • DevExpress.CodeRush.VSCore
  • DevExpress.DXCore.AssemblyResolver
  • DevExpress.DXCore.Parser

これらのアセンブリは、DevExpress IDE ツールのインストール フォルダー内にあります。たとえば、パスは次のようになります。

C:\Program Files\DevExpress 2011.1\IDETools\System\DXCore\BIN

2) 現在、異なるプログラム言語をサポートするための 3 つの追加アセンブリ:

  • DX_CPPLanguage
  • DX_CSharpLanguage
  • DX_VB言語

これらのアセンブリを使用すると、CSharp、Visual Basic、および C++ プロジェクトを解析できます。それらはここにあります:

C:\Program Files (x86)\DevExpress 2011.1\IDETools\System\DXCore\BIN\SYSTEM

3) .NET Framework アセンブリ:

  • Microsoft.Build.BuildEngine.dll

4) 最後に、いくつかの Visual Studio アセンブリ:

  • EnvDTE
  • VsLangProj

これら 2 つは "PublicAssemblies" フォルダーにあります。

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies\

さて、DXCore サポート コードです。このコードは、ソリューションとそのプロジェクトを読み込み、DXCore パーサーを初期化するために必要です。2 つのフォルダーを追加しました。

1) Helpers フォルダーには、次のクラスが含まれています。

  • LanguageHelper.cs - プロジェクトの言語を検出します (CSharp、Visual Basic、C++ など)。
  • ParserHelper.cs - DXCore パーサーといくつかの重要な DXCore サービス (ソース モデル サービスとソース コードの解析に使用される言語サービス) を初期化します。
  • SolutionParser.cs - 解析するソリューションへのパスを取得するヘルパー クラス。GetParsedSolution メソッドを呼び出すと、ソリューション全体の抽象ソース ツリーを保持する SolutionElement が返されます。

2) Loaders フォルダーには、さまざまな Visual Studio バージョンの Visual Studio プロジェクトとソリューション ローダーが含まれています。これらは、*.XXproj および *.sln ファイルの解析に使用されます。VS2002、VS2003、VS2005 用のバージョンがあります。VS2008 および VS2010 用の専用ローダーはありません。古い VS バージョン用のローダーは、新しい Visual Studio プロジェクトおよびソリューション形式のファイル (2008、2010 など) の読み取りと読み込みに完全に問題がないためです。

TestDXCoreConsoleApp の最終的な構造は次のとおりです。

DXCore ConsoleApp 構造

完全なソースを含む TestDXCoreConsoleApp はこちら(267,457 バイト、C#、VS2010) にあるため、コードを確認して、必要に応じて使用できます。Program クラスの Main 関数は次のとおりです。

static void Main(string[] args)
{
  string SolutionPath;
  if (args != null && args.Length > 0)
    SolutionPath = args[0];
  else
    SolutionPath = @"c:\Projects\TestDXCoreConsoleApp\TestDXCoreConsoleApp.sln";

  try
  {
    ParserHelper.RegisterParserServices();

    Console.Write("Parsing solution... ");

    SolutionParser solutionParser = new SolutionParser(SolutionPath);
    SolutionElement solution = solutionParser.GetParsedSolution();
    if (solution == null)
      return;

    Console.WriteLine("Done.");

    foreach (ProjectElement project in solution.AllProjects)
      foreach (SourceFile file in project.AllFiles)
        foreach (TypeDeclaration type in file.AllTypes)
        {
          Console.Write(type.FullName);
          Console.WriteLine(", members: " + ((ITypeElement)type).Members.Count);
        }
  }
  catch (Exception ex)
  {
    Console.WriteLine(ex.Message);
  }
  finally
  {
    ParserHelper.UnRegisterParserServices();
  }

  Console.ReadLine();
}

ソースを "C:\Projects" フォルダーに配置し、引数を指定せずにプログラムを実行すると、次の結果が表示されます。

DXCore コンソール アプリの結果

Enter キーを押してウィンドウを閉じます。解析プロセスには時間がかかる場合があるため、ソリューション全体が解析されるまで数秒待つ必要がある場合があることに注意してください。

于 2011-06-02T19:23:22.897 に答える