8

コード生成ツールを作成しようとしています。このツールでは、生成されたコードがビルド前に利用可能であることが重要です (つまり、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」セクションです。私のコードがこれらすべての基準を満たしていると確信しています。私は何が欠けていますか?

4

1 に答える 1