2013-04-28 94 views
8

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

回答

6

经过几天的试验和在调试器中探索,我想我已经找到了答案,不幸的是,答案是这不可能(至少不是以明确支持的方式 - 我敢肯定那里是欺骗系统的方法)。

加载项目时,项目本身发生更改(文件添加/删除,构建操作更改等)时,将执行智能感知构建(csproj.dll!CLangCompiler::RunIntellisenseBuild)。此版本将运行直至并包括Csc任务的任务。 Csc将无法​​正常执行,而只是将其输入反馈回其主机(Visual Studio)。

从这里开始,Visual Studio将跟踪SourcesCsc任务的文件。它将监视这些文件的更改,并在更改时更新IntelliSense。所以在我的例子中,如果我手动编辑Bar.g.cs这些更改将被拿起。但是,构建任务本身将不会再次运行,直到项目更改或明确请求构建。

所以,这是令人失望的,但并不奇怪,我猜。它还解释了我一直想知道的其他内容 - 具有代码隐藏功能的XAML文件倾向于具有MSBuild:Compile的自定义工具操作,可能正是出于这个原因。

我打算把这个标记为答案,但我很乐意被告知我错了,我错过了一些东西。

相关问题