It might seem surprising, but there is no a special notion of DLL in .NET. This is essentially no more than a four letters ending the file name. The central concept is "assembly" which is composed of one or more executable "modules" (don't mix up modules with assemblies referenced by another assembly). A DLL developed in .NET is just an executable module.
There are two notes about it. First, Visual Studio supports only the creation of a single-module assembly. The .NET libraries however make clear difference. You can load an assembly using Reflection and find out its modules. Compilers used directly can create modules and compose the into assemblies.
Another thing is this: a DLL "extension" (in NTFS there are no real extensions — thanks goodness; an extension is merely an end of a file name) is used for class libraries, and EXE — for applications. This is only a Visual Studio default. The file name of an assembly executable module can be anything.
Now, the classification into applications and libraries does not have fundamental character. Essentially, any application's
entry assembly (what is usually called EXE, but we remember that this is only a
main module) is just a class library. Absolutely every assembly is a class library.
Moreover, any "EXE" assembly can be referenced by any other assembly like any other library. This is not very usual, but is used sometimes in plug-in architectures. Instead of using a separate plug-in interface library, such library is implemented as a part of the host application. In such settings, a "DLL" (plug-in) references the host ("EXE"), so the host assembly is used twice: as a referenced assembly and an entry assembly of application. It never causes any problem. The only difference of application assembly is having an entry point method ("Main").
From the other hand, non-EXE assemblies can be used as applications. You can create an alternative host with different entry types, using your own custom interfaces. Assemblies which cannot be uses as applications loaded normally via the Shell could be loaded using alternative method and alternative host.
[EDIT] See also:
Assembly, DLL and EXE[
^].
—SA