The simplest assembly contains an assembly manifest and a single module
containing the application’s types, packaged as an EXE with a
Main entry point.
More complex assemblies may be composed of multiple modules (PE files),
separate resource files, manifest, etc.
The element that defines the presence of an assembly is termed the assembly manifest. The assembly manifest is not a physical construct, but rather a set of metadata that can either be included in one of the existing PE files in the assembly, or can live in a standalone PE file.
An assembly may also contain multiple modules. This technique can increase
the performance of applications that use assemblies that loaded over the
network, since the CLR only loads modules as the types contained within them
are needed. In addition, each module can be written in a different language,
allowing a mixture of C#, VB.NET, and raw MSIL. Although not common, a single
module could also be included in several different assemblies. When using
multimodule assemblies, the convention is for the module PE files to have
Finally, an assembly may contain a set of resources, which can either be kept in standalone files or included in one of the PE files in the assembly.