provided by: 
Originally published at Internet.comHistorically, developers wrote applications and created additional kinds of supporting data for those applications. The supporting data came in the form of custom data files, .INI files, database tables, and the registry. This supporting data was essential for the proper function of the application. More recently the modus operandi was to register applications and add supporting data to the registry. Then the data was retrieved programmatically by using SaveSetting or GetSetting in VB6 or an API that performed a similar function, like GetPrivateProfileString. The deficit that existed is that the application and the application's supporting information, or metadata, traveled in separate containers. VB.NET keeps its metadata with the application in a unit referred to as an assembly. An assembly contains an assembly manifest, metadata, and a portable executable, the application.
It is this combination of metadata and executable together in an assembly that make it possible for xcopy deployment of VB.NET applications. Attributes are classes derived from System.Attribute that allow developers to describe the metadata. There are attributes for every conceivable type in .Net, including assembly level, class, procedure, enumeration, and property attributes to name a few. An additional benefit of the attribute idiom is that you can implement custom attributes and effectively extend Visual Studio .NET without actually modifying or even having access to the Visual Studio code itself...
Read article at Internet.com site