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=http://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

Comments (6)

  1. enry says:

    Have you ever had an issue of compiling LINQ with msbuild.exe from command line?

    I am having this issue and basically what I experience is that msbuild.exe calls wrong csc.exe (v2.0) instead of v3.5 even though I have explicitly specify in the command line parameter that the TargetFrameworkVersion=3.5

  2. cheeso says:

    Yes, I believe what you need is an attribute like ToolsVersion="3.5" in the toplevel <Project> element in your .msbuild file.

  3. vani says:

    is it possible to  run a .cs file using msbuild?

  4. cheeso says:

    @vani – not sure what you mean by "run a .cs file", but the msbuild file in the post will actually compile .cs files, if that is what you mean.

  5. sernacio says:

    is it posible to compile a .cs file just by using the msbuild in command line? eq: msbuild MyCode.cs /target:exe .. something like this.

  6. cheeso says:

    To compile a .cs file from the command line, you want to use csc.exe , the C# compiler, which ships with the .NET runtime.  

    For v2.0, the path is C:WINDOWSMicrosoft.NETFrameworkv2.0.50727

    A sample:

    csc.exe /t:exe /debug+ /r:ReferencedLib.dll  /out:MyApp.exe  MyApp.cs