コード生成ツールを作成しようとしています。このツールでは、生成されたコードがビルド前に利用可能であることが重要です (つまり、IntelliSense の場合)。Visual Studio がプロジェクト ビルド プランを少なくとも部分的に自動的に評価して IntelliSense を生成することは知っていますが、詳細についてはあまり情報が見つかりません。
より簡単な例として、ビルド アクションを使用してすべてのアイテムを取得し、None
それらをコンパイルするとします。私はこのようなプロジェクトを持っています:
<Project [...]>
[...]
<Compile Include="Foo.cs" />
<None Include="Bar.cs" />
</Project>
コンパイルする1 つの方法Bar.cs
は、プロジェクトに次を追加することです。
<PropertyGroup>
<CoreCompileDependsOn>
$(CoreCompileDependsOn);IndirectCompile
</CoreCompileDependsOn>
</PropertyGroup>
<Target Name="IndirectCompile">
<CreateItem Include="@(None)">
<Output ItemName="Compile" TaskParameter="Include" />
</CreateItem>
</Target>
このようにすると、Visual Studio は基本的に、最初にアクションBar.cs
があった場合と同じようにCompile
動作します。IntelliSense は完全に利用可能です。変更を加えると、Bar.cs
編集中に IntelliSense にすぐに (通常はバックグラウンド操作と同じように) 反映さFoo.cs
れます。
ただし、エントリを直接コンパイルするのではなく、ディレクトリNone
にコピーしてそこからコンパイルしたいとします。これを行うには、ターゲットを次のようobj
に変更します。IndirectCompile
<Target Name="IndirectCompile"
Inputs="@(None)"
Outputs="@(None->'$(IntermediateOutputPath)%(FileName).g.cs')"
>
<Copy SourceFiles="@(None)"
DestinationFiles="@(None->'$(IntermediateOutputPath)%(FileName).g.cs')"
>
<Output TaskParameter="DestinationFiles" ItemName="Compile" />
</Copy>
</Target>
これを行うと、IntelliSense の更新が停止します。このタスクは、ビルド、依存関係の分析、およびインクリメンタル ビルド作業で機能します。Visual Studio は、入力ファイルが保存されると、タスクの実行を自動的に停止します。
したがって、それはタイトルの質問につながります: Visual Studio はターゲットを実行するかどうかを IntelliSense に対してどのように選択しますか? 私が見つけた唯一の公式ドキュメントは、これ、特に「デザイン時の IntelliSense」セクションです。私のコードがこれらすべての基準を満たしていると確信しています。私は何が欠けていますか?