Satellite Assemblies and Side-by-Side Execution
Each version of the .NET Framework contains the contract version number for all satellite assemblies shipped with that version. This number, which is specified in the SatelliteContractVersionAttribute attribute, is changed for subsequent versions of the .NET Framework. Each .NET Framework version binds to the version of a satellite assembly that it shipped with.
Satellite assemblies are often used to deploy language-specific resources for an application. These language-specific assemblies work in side-by-side execution because the application has a separate product ID for each language and installs satellite assemblies in a language-specific subdirectory for each language. When uninstalling, the application removes only the satellite assemblies associated with a given language and .NET Framework version. No core .NET Framework files are removed unless the last language for that .NET Framework version is being removed.
For example, English and Japanese editions of the .NET Framework version 1.1 share the same core files. The Japanese .NET Framework version 1.1 adds satellite assemblies with localized resources in a \ja subdirectory. An application that supports the .NET Framework version 1.1, regardless of its language, always uses the same core runtime files.
You can also set the CurrentUICulture property on a per-application or per-thread basis The application returns resources that have been localized according to the CurrentUICulture property, assuming localized files for that language have been installed. For example, an application can return English resources while running on the Japanese Windows operating system with a Japanese version of the .NET Framework version 1.1 installed.