0

C++ プロジェクトを対象とする拡張機能に取り組んでいます。プロジェクトの IncludePaths のリストを取得する必要があります。VS IDE では、メニュー -> プロジェクト -> プロパティ -> 構成プロパティ -> C++ -> 一般 -> 追加のインクルード ディレクトリです。それが、拡張機能でプログラムによって取得する必要があるものです。

対応する VCProject インスタンスがあり、VCConfiguration インスタンスもあります。オートメーション モデルの概要チャートから判断すると、プロジェクトと構成の両方に一連のプロパティがあります。ただし、利用できないようです。実行時に VCConfiguration および VCProject オブジェクトの内容を調べた場合でも、VCConfiguration クラスにも VCProject クラスにもプロパティ コレクションはありません。

MSDN ドキュメントも洞察を提供しません。VCConfiguration インターフェイスにはプロパティ PropertySheets がありますが、実行時にデバッガーを使用して調べたところ、必要なものではないと判断しました。

PSコマンドラインプロパティの値を取得できた場合(プロジェクト->プロパティ->構成プロパティ-> C++->コマンドライン)、指定されたプロジェクトに対して引数コンパイラのリストが呼び出されます-それも私にとっては問題ありません、その文字列を解析して、すべてのインクルード パスを取得できます。

4

1 に答える 1

1

あなたはおそらく私の余分ながらくたのいくつかを削除したいと思うでしょう...しかし、これはトリックを行うはずです:

  public string GetCommandLineArguments( Project p )
  {
     string returnValue = null;

     try
     {
        if ( ( Instance != null ) )
        {
           Properties props = p.ConfigurationManager.ActiveConfiguration.Properties;
           try
           {
              returnValue = props.Item( "StartArguments" ).Value.ToString();
           }
           catch
           {
              returnValue = props.Item( "CommandArguments" ).Value.ToString();
              // for c++
           }
        }
     }
     catch ( Exception ex )
     {
        Logger.Info( ex.ToString() );
     }

     return returnValue;
  }

これらもおそらく役に立ちます: (プロジェクトが持つプロパティとその値を確認できます)

public void ShowProjectProperties( Project p )
      {
         try
         {
            if ( ( Instance != null ) )
            {
               string msg = Path.GetFileNameWithoutExtension( p.FullName ) + " has the following properties:" + Environment.NewLine + Environment.NewLine;

               Properties props = p.ConfigurationManager.ActiveConfiguration.Properties;
               List< string > values = props.Cast< Property >().Select( prop => SafeGetPropertyValue( prop) ).ToList();
               msg += string.Join( Environment.NewLine, values );
               MessageDialog.ShowMessage( msg );
            }
         }
         catch ( Exception ex )
         {
            Logger.Info( ex.ToString() );
         }
      }

      public string SafeGetPropertyValue( Property prop )
      {
         try
         {
            return string.Format( "{0} = {1}", prop.Name, prop.Value );
         }
         catch ( Exception ex )
         {
            return string.Format( "{0} = {1}", prop.Name, ex.GetType() );
         }
      }
于 2013-10-02T14:44:43.950 に答える