我正在尝试编写代码生成工具。对于这个工具来说,生成的代码在构建之前是可用的(例如,用于智能感知)。我知道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,特别是“设计时智能感知”部分。我很确定我的代码符合所有这些标准。我错过了什么?