我正在嘗試編寫代碼生成工具。對於這個工具來說,生成的代碼在構建之前是可用的(例如,用於智能感知)。我知道Visual Studio將至少部分地自動評估項目構建計劃以生成IntelliSense,但我無法找到有關細節的很多信息。Visual Studio如何決定何時以及如何重建IntelliSense?
作爲一個更簡單的例子,假設我想採取構建動作None
的所有項目並編譯它們。我有這樣一個項目:
<Project [...]>
[...]
<Compile Include="Foo.cs" />
<None Include="Bar.cs" />
</Project>
一種方式來獲得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
行動開始。智能感知完全可用;如果我在Bar.cs
中進行了更改,那麼在編輯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>
這樣做會導致智能感知停止更新。該任務適用於構建,依賴關係分析和增量構建工作,Visual Studio只是在輸入文件保存時自動停止運行。
因此,這導致了標題問題:Visual Studio如何選擇運行目標或不運行智能感知?我發現的唯一官方文檔是this,特別是「設計時智能感知」部分。我很確定我的代碼符合所有這些標準。我錯過了什麼?