MSBuild script for compiling all .cs files into a single assembly (DLL or EXE)

I love Visual Studio, but sometimes I build code using no graphical IDE - just the .NET Framework SDK.  I wrote an article not long ago describing how to build a WCF Service using .NET 3.5, and just the SDK. 

I've always been a makefile weenie, but msbuild is the new build tool - it really makes sense to me.  One of the things that took a little effort for me was figuring out the msbuild script I wanted.  Basically I wanted to just compile all the C# code contained in a directory, into a single assembly (EXE or DLL). As I build out an idea, I often will iterate rapidly on an app - introducing and removing C# files as it makes sense to me, and I want the build script to remain the same - just compile whatever files it finds.

Enclosed here is what I came up with, for my .NET Framework 3.5 SDK environment.  Maybe it will work for you, too.  

    1 <Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003"

    2         DefaultTargets="CompileAll"

    3         ToolsVersion="3.5"

    4   >

    5 

    6   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

    7   <!-- Import Project="c:\.net3.5\Microsoft.Csharp.targets" /    -->

    8 

    9   <PropertyGroup>

   10     <!-- This AppName thing is the base name of your DLL or EXE -->

   11     <AppName>YourAppNameHere</AppName>

   12   </PropertyGroup>

   13 

   14   <!-- This build file compiles each .cs file into its own exe -->

   15   <PropertyGroup Condition="'$(Configuration)'==''">

   16     <Configuration>Debug</Configuration>

   17     <!-- Default -->

   18   </PropertyGroup>

   19 

   20   <PropertyGroup Condition="'$(Configuration)'=='Debug'">

   21     <Optimize>false</Optimize>

   22     <DebugSymbols>true</DebugSymbols>

   23     <!-- <OutputPath>.\bin</OutputPath>  -->

   24     <OutputPath>.\</OutputPath>

   25     <OutDir>.\</OutDir>

   26     <IntermediateOutputPath>.\</IntermediateOutputPath>

   27   </PropertyGroup>

   28 

   29 

   30   <!-- Specify the inputs by type and file name -->

   31   <ItemGroup>

   32     <CSFile Include="*.cs"/>

   33   </ItemGroup>

   34 

   35 

   36   <!-- specify reference assemblies for all builds in this project -->

   37   <ItemGroup>

   38     <Reference Include="mscorlib" />

   39     <Reference Include="System" />

   40     <Reference Include="System.Core" />

   41     <Reference Include="System.Data" />

   42     <Reference Include="System.Data.Linq" />

   43     <Reference Include="System.ServiceModel" />

   44     <Reference Include="System.ServiceModel.Web" />

   45     <Reference Include="System.Runtime.Serialization" />

   46     <!-- <Reference Include=".\ObjectDumper.dll" /> -->

   47   </ItemGroup>

   48 

   49 

   50   <Target Name="CompileAll"

   51           DependsOnTargets="ResolveAssemblyReferences"

   52     >

   53 

   54     <Message Text="Reference = @(Reference)" />

   55     <Message Text="ReferencePath = @(ReferencePath)" />

   56 

   57 

   58     <!-- Message Text="MS Build Tools path: $(MSBuildToolsPath)" / -->

   59 

   60     <!-- Run the Visual C# compilation on all the .cs files. -->

   61 

   62     <CSC

   63       Sources="@(CSFile)"

   64       References="@(ReferencePath)"

   65       OutputAssembly="$(OutputPath)\$(AppName).exe"

   66       EmitDebugInformation="$(DebugSymbols)"

   67       TargetType="exe"

   68       Toolpath="$(MSBuildToolsPath)"

   69       Nologo="true"

   70         />

   71   </Target>

   72 

   73   <!-- redefine the Clean target, from the Microsoft.csharp.targets file. (Last definition wins) -->

   74   <Target Name="Clean">

   75     <Delete Files="$(OutputPath)\$(AppName).exe"/>

   76     <Delete Files="$(OutputPath)\$(AppName).pdb"/>

   77     <Delete Files="%(CSFile.identity)~"/>

   78     <Delete Files="build.xml~"/>

   79   </Target>

   80 

   81 </Project>

To use it, run this:
    c:\windows\Microsoft.NET\Framework\v3.5\msbuild.exe build.xml