Check out this article : Merging .NET assemblies using ILMerge
As you know, traditional linking of
object code is no longer necessary in
.NET. A .NET program will usually
consist of multiple parts. A typical
.NET application consists of an
executable assembly, a few assemblies
in the program directory, and a few
assemblies in the global assembly
cache. When the program is run, the
runtime combines all these parts to a
program. Linking at compile time is no
longer necessary.
But sometimes, it is nevertheless
useful to combine all parts a program
needs to execute into a single
assembly. For example, you might want
to simplify the deployment of your
application by combining the program,
all required libraries, and all
resources, into a single .exe file.
csc /target:library /out:ClassLibrary1.dll ClassLibrary1.cs
vbc /target:library /out:ClassLibrary2.dll ClassLibrary2.vb
vbc /target:winexe /out:Program.exe
/reference:ClassLibrary1.dll,ClassLibrary2.dll Program.vb
.
ilmerge /target:winexe /out:SelfContainedProgram.exe
Program.exe ClassLibrary1.dll ClassLibrary2.dll