【问题标题】:How does Visual Studio decide when and how to rebuild IntelliSense?Visual Studio 如何决定何时以及如何重建 IntelliSense?
【发布时间】: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


    【解决方案1】:

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

    加载项目时,以及项目本身发生变化(添加/删除文件、更改构建操作等)时,会执行 IntelliSense 构建 (csproj.dll!CLangCompiler::RunIntellisenseBuild)。此构建将运行直到并包括 Csc 任务的任务。 Csc 不会正常执行,而只是将其输入反馈到其主机 (Visual Studio)。

    从此时起,Visual Studio 将跟踪作为Sources 提供给Csc 任务的文件。它将监视这些文件的更改,并在它们更改时更新 IntelliSense。因此,在我的示例中,如果我手动编辑Bar.g.cs,这些更改将被拾取。但在项目更改或明确请求构建之前,构建任务本身不会再次运行。

    所以,我想这很令人失望,但并不奇怪。它还解释了我一直想知道的其他问题——带有代码隐藏的 XAML 文件往往具有 MSBuild:Compile 的自定义工具操作,大概正是出于这个原因。

    我将把它标记为答案,但我很想被告知我错了,我错过了一些东西。

    【讨论】:

      猜你喜欢
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 2013-03-22
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多