Linker (light)
The Windows Installer XML linker is exposed by light.exe. Light is responsible for processing one or more .wixobj files, retrieving metadata from various external files and creating a Windows Installer database (MSI or MSM). When necessary, light will also create cabinets and embed streams in the created Windows Installer database.
The linker begins by searching the set of object files provided on the command line to find the entry section. If more than one entry section is found, light fails with an error. This failure is necessary because the entry section defines what type of Windows Installer database is being created, a MSI or MSM. It is not possible to create two databases from a single link operation.
While the linker was determining the entry section, the symbols defined in each object file are stored in a symbol table. After the entry section is found, the linker attempts to resolve all of the references in the section by finding symbols in the symbol table. When a symbol is found in a different section, the linker recursively attempts to resolve references in the new section. This process of gathering the sections necessary to resolve all of the references continues until all references are satisfied. If a symbol cannot be found in any of the provided object files, the linker aborts processing with an error indicating the undefined symbol.
After all of the sections have been found, complex and reverse references are processed. This processing is where Components and Merge Modules are hooked to their parent Features or, in the case of Merge Modules, Components are added to the ModuleComponents table. The reverse reference processing adds the appropriate Feature identifier to the necessary fields for elements like, Shortcut, Class, and TypeLib.
Once all of the references are resolved, the linker processes all of the rows retrieving the language, version, and hash for referenced files, calculating the media layout, and including the necessary standard actions to ensure a successful installation sequence. This part of the processing typically ends up generating additional rows that get added associated with the entry section to ensure they are included in the final Windows Installer database.
Finally, light works through the mechanics of generating IDT files and importing them into the Windows Installer database. After the database is fully created, the final post processing is done to merge in any Merge Modules and create a cabinet if necessary. The result is a fully functional Windows Installer database.
Binder Variables
Standard Binder Variables
Some properties are not available until the linker is about to generate, or bind, the final output. These variables are called binder variables and supported binder variables are listed below.
All Versioned Files
The following standard binder variables are available for all versioned binaries.
Variable name |
Example usage |
Example value |
bind.fileLanguage.FileID |
!(bind.fileLanguage.MyFile) |
1033 |
bind.fileVersion.FileID |
!(bind.fileVersion.MyFile) |
1.0.0.0 |
Assemblies
The following standard binder variables are available for all managed and native assemblies (except where noted), where the File/@Assembly attribute is set to ".net" or "win32".
Variable name |
Example usage |
Example value |
bind.assemblyCulture.FileID |
!(bind.assemblyCulture.MyAssembly) |
neutral |
bind.assemblyFileVersion.FileID |
!(bind.assemblyFileVersion.MyAssembly) |
1.0.0.0 |
bind.assemblyFullName.FileID |
!(bind.assemblyName.MyAssembly) |
MyAssembly, version=1.0.0.0, culture=neutral, publicKeyToken=0123456789abcdef, processorArchitecture=MSIL |
bind.assemblyName.FileID |
!(bind.assemblyName.MyAssembly) |
MyAssembly |
bind.assemblyProcessorArchitecture.FileID |
!(bind.assemblyProcessorArchitecture.MyAssembly) |
MSIL |
bind.assemblyPublicKeyToken.FileID |
!(bind.assemblyPublicKeyToken.MyAssembly) |
0123456789abcdef |
bind.assemblyType.FileID |
!(bind.assemblyType.MyAssembly) |
win32 |
bind.assemblyVersion.FileID |
!(bind.assemblyVersion.MyAssembly) |
1.0.0.0 |
Localization Variables
Variables can be passed in before binding the output file from a WiX localization file, or .wxl file. This process allows the developer to link one or more .wixobj files together with diferent .wxl files to produce different localized packages.
Localization variables are in the following format:
!(loc.VariableName)
Custom Binder Variables
You can create your own binder variables using the WixVariable element or by simply typing your own variable name in the following format:
!(bind.VariableName)
Custom binder variables allow you to use the same .wixobj files but specify different values when linking, similar to how localization variables are used. You might use binder variables for different builds, like varying the target processor architecture.