Namespace is a logical grouping of class. Semantically related types contained in an assembly or possibly spread across multiple related assemblies thus formed namespaces. For example, the System.IO namespace contains file I/O related types, the System.Data namespace defines basic database types, and so on. It is very important to remember that a single assembly (such as mscorlib.dll) can contain any number of namespaces, each of which can contain any number of types.
Assembly is physical grouping of logical units, Namespace, logically groups classes. Namespace can span multiple assemblies.
Version information is stored in assembly inside the manifest.
Versioning concept is only applicable to global assembly cache (GAC) as private assembly lie in their individual folders. This does not mean versioning is not needed; you can still version it to have better version control on the project.
GAC (Global Assembly Cache) is where all shared .NET assembly resides.
Garbage collection is a CLR feature, which automatically manages memory. Programmers forget to release the objects while coding. CLR automatically releases objects when they are no longer in use and referenced. CLR runs on non-deterministic to see the unused objects and cleans them. One side effect of this non-deterministic feature is that we cannot assume an object is destroyed when it goes out of the scope of a function. We should avoid using destructors because before GC destroys the object it first executes destructor in that case it will have to wait for code to release the unmanaged resource. This results in additional delays in GC. So it is recommended to implement IDisposable interface, write cleanup code in Dispose method, and call GC.SuppressFinalize method. It’s like instructing GC not to call your constructor.
System.GC.Collect () forces garbage collector to run. This is not recommended but can be used if situations arise.
DLL Hell describes the difficulty in managing DLLs on a system; this includes multiple copies of a DLL, different versions, and so forth. When a DLL (or assembly) is loaded in .NET, it is loaded by name, version, and certificate. The assembly contains all of this information via its metadata. The GAC provides the solution, as you can have multiple versions of a DLL side-by-side.