2

メインシステムの 1 つに非常に大きな解決策があり、ずっと前に行うべきだった分岐をついに行っていますが、ちょっと。

  • 主要
    • 開発(新規開発)
    • サービスパック(バグ修正)
      • リリース(ロックダウン、現在クライアントとの関係)

バグのないところまで主なソリューションを手に入れたところです(テスト済みで、クライアント向けにサインオフする準備ができています)。ただし、私たちの主な解決策は次のようなものです。

  • 主要
    • プロジェクトA
      • 参照 A (C:\DLLS)
      • リファレンス B (C:\DLLS)
      • プロジェクト B (ローカル参照)
    • プロジェクトB
      • 参照 A (C:\DLLS)
      • リファレンス B (C:\DLLS)

直接的なリレーショナル プロジェクトがある場合、それらはアプリケーションのモジュールであり、ローカルで参照される傾向があります (プロジェクト B)。外部参照はカスタム ユーティリティ クラスであり、ソリューションには存在しないため、ビルドされてフォルダーに配置されます (分岐を検討していないソリューションが 1 つしかない場合はこれで問題ありません)。

問題

問題は、私が分岐していることです。各分岐は 1 つのセクションを参照し、分岐ごとにコードを変更することはできません。MAIN現在のものをロードして、それが持っている参照とソリューション内の場所を確認できるようにしたいのですが、使用しようreflectionAssembliesしましたMAIN.EXEが、プロジェクトの場所ではなく名前などの参照された.DLLの情報のみを提供しますであることを期待しています。それから私はMicrosoft.Build.BuildEngine

  Project p = new Project();
  //This is the cs/vb project file
  p.Load(_projectPath);
  var v = p.Imports;

これは正しいことではありません。基本的に、特定のプロジェクト ファイルの参照場所のリストを取得しようとしていますが、何ができるかについて何か提案はありますか?

4

1 に答える 1

3

私は使用して勝者になりましたMicrosoft.Build.BuildEngine-各参照は、私が必要とするものを与えるBuildItemMetaData呼ばれています。HintPathこれを試してみたい人へ:

  Project p = new Project();
  p.Load(_projectPath);
  var buildItems = p.ItemGroups.Cast<BuildItemGroup>().Where(x => x.Cast<BuildItem>().Any(y => y.Name.ToLower().Contains("reference"))).Select(x => x.Cast<BuildItem>()).ToList();
  var buildItemPaths = buildItems.SelectMany(x => x.Select(y => y.GetMetadata("HintPath").ToString())).ToList<string>();

これは私が必要としていたものを私に与えてくれます - うまくいけば他の人にも役立ちます。

于 2012-10-17T11:34:24.823 に答える