2

いくつかの異なる構成でビルドされた C# プロジェクトがあります。一部のソース ファイルは常に含める必要があり、一部は特定の構成でのみ含める必要があります。これまでのところ、ファイル全体でこれを行ってきましたが、#if ... #endifこれをより適切に行うための小さな拡張機能を作成したいと考えていました。

Conditionファイルのコンテキスト メニューに項目を追加する拡張機能を作成しましたが、プロジェクト ファイルの項目ノードに属性を設定する方法が見つかりません。

Propertiesインターフェイスのコレクションを見てきましたが、EnvDTE.ProjectItem有用なものは何も見当たりません (BuildAction を除いて... 私はそれに戻ります)。

次にIVsBuildPropertyStorage、アイテムを取得して呼び出してみSetItemAttribute()ました。これにより、プロジェクト ファイルに情報が追加されますが、次のような子要素として追加されます。

<ItemGroup>
  <Compile Include="Program.cs">
    <Condition>%27%24%28Configuration%29%27==%27Debug%27</Condition>
  </Compile>
</ItemGroup>

私が達成しようとしていたのは:

<ItemGroup>
  <Compile Include="Program.cs" Condition="'$(Configuration)'=='Debug'" />
</ItemGroup>

項目ノードではなく、上部近くのセクションにIVsBuildPropertyStorage.SetPropertyValue()同様の子要素を追加する but もあります。PropertyGroup

「プロジェクトのサブタイプ/フレーバー」を見てきましたが IVsBuildPropertyStorage、それは別の . それらは多くの複雑なことを実行できるように見えますが、この件に関するドキュメントは最小限で曖昧に見えます。

MSBuild アセンブリを使用してプロジェクト ファイルを直接読み込んで操作する方法を説明している投稿を見たことがありますが、Visual Studio を混乱させずに変更を失う可能性があるため、いつ安全にそれを行うことができるかわかりません。プロジェクト ファイルへの変更を検出します。

最後のアイデアとして、 と の間でBuildActionプロパティを操作することを考えましたが、たとえば、ユーザーが IDE で構成を切り替えるたびに同期を維持して、拡張機能を正しく維持するのは大変な作業になる可能性があるように思えます。CompileNone

この種の経験があり、私にアドバイスをくれる人はいますか?それとも、希望をあきらめて、#ifどこにでも手動でディレクティブを追加することに固執する必要がありますか?

4

2 に答える 2

0

あなたが言及したMSBuildオプションを調べたいと思うかもしれません。

Visual Studio には MSBuild プロジェクトに直接アクセスする方法があるため、実際にはファイルから MSBuild プロジェクトを読み込む必要はありません。

string projectPath = projectItem.ContainingProject.FullName;
MsBuildProject project = ProjectCollection.GlobalProjectCollection.GetLoadedProjects(projectPath);
var compileItems = project.GetItems("Compile");

そこから特定のアイテムを見つけて、場合によっては条件属性を追加できますが、この手順を自分で試したことはありません (これが機能しない場合は、project.Xml代わりにプロパティの下のプロジェクト要素を変更してみる必要があるかもしれません)。

project.Save()その後、「プロジェクトをリロードしますか?」をトリガーしてはならない を呼び出すことができます。これは、MsBuild プロジェクト インスタンスが Visual Studio プロジェクト階層にリンクされているためです。

ただし、ビルド構成を切り替えると (たとえば、デバッグとリリースの間で)、MSBuild エンジンがビルド中にアイテムの条件を再評価しない可能性があるため、Visual Studio にプロジェクトを強制的に再読み込みさせたい場合があります。プログラムでこれを行うコードは、次の場所にあります。

基になるファイルを変更した後、VS プロジェクトをプログラムで更新/再読み込みするにはどうすればよいですか?

于 2012-09-14T07:48:45.467 に答える