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