【发布时间】:2013-04-22 10:24:31
【问题描述】:
我正在尝试编写代码生成工具。对于此工具,重要的是生成的代码在构建之前可用(即,用于 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 操作开始时相同。 IntelliSense 完全可用;如果我在 Bar.cs 中进行更改,它会在我编辑 Foo.cs 时立即反映在 IntelliSense 中(嗯,与通常的后台操作一样立即),等等。
但是,假设不是直接编译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 选择运行目标?我发现的唯一官方文档是this,特别是“设计时智能感知”部分。我很确定我的代码符合所有这些标准。我错过了什么?
【问题讨论】:
标签: visual-studio msbuild intellisense