いくつかの異なる構成でビルドされた 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 で構成を切り替えるたびに同期を維持して、拡張機能を正しく維持するのは大変な作業になる可能性があるように思えます。Compile
None
この種の経験があり、私にアドバイスをくれる人はいますか?それとも、希望をあきらめて、#if
どこにでも手動でディレクティブを追加することに固執する必要がありますか?