2013-04-28 49 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的自定義工具操作,可能正是出於這個原因。

我打算把這個標記爲答案,但我很樂意被告知我錯了,我錯過了一些東西。

相關問題