2010-04-05 72 views
1

我有一個ANTLR語法文件作爲C#項目文件的一部分,並遵循User Manual中列出的步驟。MSBuild似乎只將舊輸出文件用於定製構建工具

<Project ...> 
    <PropertyGroup> 
     <Antlr3ToolPath>$(ProjectDir)tools\antlr-3.1.3\lib</Antlr3ToolPath> 
     <AntlrCleanupPath>$(ProjectDir)AntlrCleanup\$(OutputPath)</AntlrCleanupPath> 
    </PropertyGroup> 
    <ItemGroup> 
     <Antlr3 Include="Grammar\Foo.g"> 
      <OutputFiles>FooLexer.cs;FooParser.cs</OutputFiles> 
     </Antlr3> 
     <Antlr3 Include="Grammar\Bar.g"> 
      <OutputFiles>BarLexer.cs;BarParser.cs</OutputFiles> 
     </Antlr3> 
    </ItemGroup> 
    <Target Name="GenerateAntlrCode" 
      Inputs="@(Antlr3)" 
      Outputs="%(Antlr3.OutputFiles)"> 
     <Exec Command="java -cp %22$(Antlr3ToolPath)\antlr-3.1.3.jar%22 org.antlr.Tool -message-format vs2005 @(Antlr3Input)" Outputs="%(Antlr3Input.OutputFiles)" /> 
     <Exec Command="%22$(AntlrCleanupPath)\AntlrCleanup.exe%22 @(Antlr3Input) %(Antlr3Input.OutputFiles)" /> 
    </Target> 
    <ItemGroup> 
     <!-- ...other files here... --> 
     <Compile Include="Grammar\FooLexer.cs"> 
      <AutoGen>True</AutoGen> 
      <DesignTime>True</DesignTime> 
      <DependentUpon>Foo.g</DependentUpon> 
      </Compile> 
      <Compile Include="Grammar\FooParser.cs"> 
       <AutoGen>True</AutoGen> 
       <DesignTime>True</DesignTime> 
       <DependentUpon>Foo.g</DependentUpon> 
      </Compile> 
      <!-- ... --> 
    </ItemGroup> 
</Project> 

無論出於何種原因,Compile步驟僅使用代碼的舊版本,沒有扭捏的量出現,以幫助。

「舊版本」,我的意思是說,如果我清理解決方案,建立項目,Foo.g將使FooLexer.csFooParser.cs。如果我應該更新到Foo.g並重新編譯,則詞法分析器和分析器C#文件的新版本將被忽略,並使用舊版本。我必須再次編譯...

+0

有關C#和antlr的更多信息? – Kiquenet 2010-08-18 11:44:37

回答

1

IDE中似乎存在一個錯誤:Visual Studio只監視它修改自身的C#文件(例如設計器生成的代碼)中的更改。對於在IDE之外修改/生成的代碼(例如ANTLR等外部工具),它將使用文件的內存版本,而不從磁盤刷新它。

解決方法是不使用「託管」緩存,而是生成外部CSC進程來編譯項目。您可以通過在你的.csproj設置「UseHostCompilerIfAvailable」項目屬性設置爲false,像這樣做:

<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>

欲瞭解更多信息,請參閱this entry in the MS Connect website

我在Visual Studio中遇到了與ANTLR完全相同的問題,並且這爲我解決了這個問題。但是,有些人在將該選項設置爲'false'之後會報告項目之間依賴關係的問題,因此請小心副作用...

+0

在csproj中,你把UseHostCompilerIfAvailable選項放在哪裏,Ludovic? – DevDave 2013-02-13 11:44:08

+1

將它添加到您的.csproj文件中的一個'ProprtyGroup's(很可能是第一個,因爲其他的對它們有條件,並且僅在Debug/Release中進行評估)。 – Ludovic 2013-02-14 19:21:00

相關問題