Side-by-side assembly
Side-by-side technology is a standard for executable files in Windows 98 Second Edition, Windows 2000, and later versions of Windows that attempts to alleviate problems (known as "DLL Hell") that arise from the use of dynamic-link libraries (DLLs) in Microsoft Windows. Such problems include version conflicts, missing DLLs, duplicate DLLs, and incorrect or missing registration. In side-by-side, Windows stores multiple versions of a DLL in the winsxs subdirectory of the Windows directory, and loads them on demand. This reduces dependency problems for applications that include a side-by-side manifest.
Side-by-side technology is also known as WinSxS or SxS, although technically WinSxS refers only to the global side-by-side store (officially called the "Windows component store"), which is conceptually the native equivalent of the .NET Global Assembly Cache. Executables that include an SxS manifest are designated SxS assemblies.
Microsoft Visual C++ 2005 and 2008 employ SxS with all C runtime libraries. However, runtime libraries in Visual C++ 2010 no longer use this technology; instead, they include the version number of a DLL in its file name, which means that different versions of one DLL will technically be completely different DLLs now.[1][2]
SxS is also the technological basis for registration-free COM activation. Only in-process COM servers may be activated this way.
Operation
An application that employs SxS must have a manifest. Manifests are typically a section embedded in the application's executable file but may also be an external file. When the operating system loads the application and detects the presence of a manifest, the operating system DLL loader is directed to the version of the DLL corresponding to that listed in the manifest. If there is no manifest, the DLL loader loads a default version of all DLL dependencies. If the DLL is a COM server, it must have a manifest of its own for registration-free activation to succeed.
On Windows Vista and later, sxstrace.exe can help to diagnose failures in the starting of applications due to SxS misconfiguration.
If a user wishes to override manifest-specified assemblies (for example, in the case of security patches applied to a library), a publisher configuration file can globally redirect assemblies. Digital signatures can ensure that the legitimacy of such redirection.[3]
Manifest format
The manifest is internally represented as XML. The URN associated with SxS manifests is "urn:schemas-microsoft-com:asm.v1".
Several other recent Microsoft technologies such as ClickOnce employ the same manifest format.
Example manifest
The following is an example of a manifest for an application that depends on a C runtime DLL.
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>
Activation contexts
A manifest like the one above is parsed into an activation context by the SxS loader. There is a stack of activation contexts for each thread or fiber. An API allows programmatic manipulation of these contexts. It may be necessary for a library (DLL) to change its activation context, for example if it requires a specific version of another library for its own consumption instead of using the activation context of its caller. This type of issue is sometimes called (activation context) pollution.[4] To prevent polluting its activation context, a DLL can have a manifest embedded as a resource, which is parsed when the DLL is loaded. This manifest must be at resource id 2 in the image file for the loader to find it.[5]
WinSxS (Windows component store)
From Vista onward, the operating system also uses WinSxS for its core components. Operating system files in the winsxs directory are hard linked to from their usual locations in the Windows directory structure. A file in a subdirectory in winsxs may be linked from multiple locations (e.g. the System32 directory and application directories). Windows Explorer double-counts the disk space occupied by these files.[6] This can be demonstrated using the fsutil command-line program.[7] Some third-party Explorer extensions to show the link count also exist.
However, not all files from winsxs are projected this way to "live" operating system files. For example, after installing some Windows updates, old file versions replaced by the updates are still kept in winsxs although they are no longer linked in the "live" Windows directories. This allows updates to be uninstalled safely.[8]
Because of its elevated importance, from Vista onward the winsxs directory is owned by the Trusted Installer service SID. By default not even administrators can modify its contents (without taking ownership first). Uninstalling applications does not immediately free space in the winsxs directory; space for unused assemblies is garbage-collected over time by the Installer service.[9]
Although not officially documented, the algorithm for generating the directory names residing inside the winsxs directory has been made public on an MSDN Microsoft employee's blog. The algorithm was changed in the transition from XP to Vista.[10]
Advantages
- For applications that have been built with SxS, multiple applications may coexist that depend on different versions of the same DLL. This is in contrast to non-SxS DLL environments where an original DLL in a shared system folder may be overwritten by the subsequent installation of another program that depends on a different version of the same DLL.
- The XML formatting of the manifest is human-legible and thus makes it easier for developers to determine the dependencies of an application and their versions.
Disadvantages
- In Windows XP, a bug in sxs.dll causes heap corruption, leading to application crashes. This issue is not fixed by any XP service pack. Users must manually install a QFE (Quick Fix Engineering).[11]
- Considerably higher apparent disk space consumption. The winsxs directory typically starts at several gigabytes in size and continues to grow as applications are installed. Further, there is currently no supported way to significantly reduce the size of the winsxs directory.[8] (However, most of the contents of winsxs are just additional hard links to files that exist elsewhere in any case, and do not actually use any extra disk space.)
Misconceptions
The winsxs directory is thought to be much larger than it actually is. The directory contains mostly "hard links" to files that exist elsewhere.
[Note: The preceding two sentences themselves appear to be 'misconceptions' because the rest of this article explains how files are stored in the directory (component store) and any associated hardlinks exist elsewhere. However, the various uses of "hardlink" may be inappropriate. What appears to be a file 'contained' in winsxs or another folder (e.g. System32) is accessed via a link to where the file content is stored, and the term "hardlink" is used where there is more than one link to such content.[12]]
DIR and Explorer are not aware of the difference between an actual file and a hard link to a file (most likely because there is no such difference; they're really just different names that happen to belong to the same file), and so may count the same file several times, adding incorrectly to the perceived disk usage. The disk usage reported by these two programs is as if each hard link is an actual file.[13][14]
See also
Notes
- ↑ Section "Visual C++ Libraries" in Breaking Changes in Visual C++. Retrieved on 2010-09-10.
- ↑ See section "Differences between Visual C++ 2008 and Visual C++ 2010" in "Deployment in Visual C++ 2010". Retrieved on 2010-09-10.
- ↑ Publisher Configuration (Windows)
- ↑ Wiswall, Jon (2006-01-07). "Fixing Activation Context Pollution". Nothing ventured, nothing gained. Microsoft.
- ↑ Wiswall, Jon (2006-01-17). "DLLs and resource ID 2 manifests". Nothing ventured, nothing gained. Microsoft.
- ↑ "KB 2592038: How to Alleviate Disk Space Pressure Caused By a Large Windows Component Store (WinSxS) Directory". support.microsoft.com. Archived from the original on 2012-10-14.
- ↑ joscon (2010-08-06). "Should you delete files in the \WinSXS directory? And what’s the deal with VSS?". The Windows Servicing Guy.
- 1 2 Huges, Jeff (2008-09-17). "What is the WINSXS directory in Windows 2008 and Windows Vista and why is it so large?". Microsoft Corporation. Retrieved 15 March 2011.
- ↑ Wiswall, Jon (2007-01-02). "Deleting from the WinSxS directory". Nothing ventured, nothing gained. Microsoft.
- ↑ Wiswall, Jon (2005-12-28). "What's that awful directory name under Windows\WinSxS?". Nothing ventured, nothing gained. Microsoft.
- ↑ "KB 943232: An application that uses the Sxs.dll file crashes when you run the application on a Windows XP-based computer". support.microsoft.com. Archived from the original on 2012-10-27.
- ↑ joscon (2011-01-06). "How hard links work". The Windows Servicing Guy.
- ↑ Sinofsky, Steven (2008-11-19). "Disk Space". Engineering Windows 7. Microsoft.
- ↑ "WinSxS Disk Space Usage: It’s Not What You Think". David's Blog. davidlenihan.com.
External links
- Side-by-Side Assemblies (Windows)
- Windows Side-by-Side Assemblies
- ClickOnce Deployment Manifest Format
- Configuring .NET-Based Components for Registration-Free Activation
- Side-by-side assemblies zdnet webcast
- Diagnosing SideBySide failures
- Diagnose SideBySide failures in Windows XP/Windows Server 2003