Last active
July 28, 2025 03:09
-
-
Save KirillOsenkov/f20cb84d37a89b01db63f8aafe03f19b to your computer and use it in GitHub Desktop.
Sample of generating a .cs file during build and adding it to the compilation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <Project Sdk="Microsoft.NET.Sdk"> | |
| <PropertyGroup> | |
| <OutputType>Exe</OutputType> | |
| <TargetFramework>net472</TargetFramework> | |
| </PropertyGroup> | |
| <PropertyGroup> | |
| <GeneratedText><![CDATA[ | |
| using System%3B | |
| public class Hello$(TargetFramework) | |
| { | |
| public void Print() | |
| { | |
| Console.WriteLine("Hello $(TargetFramework)!")%3B | |
| } | |
| } | |
| ]]></GeneratedText> | |
| </PropertyGroup> | |
| <Target Name="AddGeneratedFile" BeforeTargets="BeforeCompile;CoreCompile" Inputs="$(MSBuildAllProjects)" Outputs="$(IntermediateOutputPath)GeneratedFile.cs"> | |
| <PropertyGroup> | |
| <GeneratedFilePath>$(IntermediateOutputPath)GeneratedFile.cs</GeneratedFilePath> | |
| </PropertyGroup> | |
| <ItemGroup> | |
| <Compile Include="$(GeneratedFilePath)" /> | |
| <FileWrites Include="$(GeneratedFilePath)" /> | |
| </ItemGroup> | |
| <WriteLinesToFile Lines="$(GeneratedText)" File="$(GeneratedFilePath)" WriteOnlyWhenDifferent="true" Overwrite="true" /> | |
| </Target> | |
| </Project> |
Rebuild does Clean;Build. I think in that case, because the generated file isn't added to @(FileWrites), it's not getting deleted/cleaned up on Clean, so Rebuild doesn't reset its state.
Incremental build for targets is unconfigurable: it's always on.
A log at detailed or diagnostic level should show the target being skipped as up to date.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@rainersigwald,
Would this explain why the following generates
GeneratedFile.csthe first time, but never regenerates it, even after aRebuild?Does
Rebuildforce the up-to-date check to return false, but MSBuild decides the target still doesn't need to execute becauseGeneratedFile.cswas updated more recently than$(MSBuildAllProjects)?