Change History

Deployment Tools Foundation .NET

Deployment Tools Foundation Change History
Overview > Change History


See What's New?


  • New custom action proxy
    • Managed custom actions use an XML config file to specify the CLR version.
    • New CAPack module is an unmanaged self-extracting CA DLL that can wrap both managed and unmanaged custom actions. (The old managed CAProxy module is obsolete.)
    • Custom action build process is different but still complicated -- see documentation for details.
    • CustomActionAttribute no longer accepts the optional NativeDependencies parameter since it does not apply to the new proxy (all packaged files are always extracted and available when the CA executes).
  • 64bit support
    • Various code fixes to pointer/handle types and structure alignments.
    • Cabinet and MSI libraries tested on AMD64 CLR.
    • Unmanaged and managed parts of custom action proxy tested on AMD64.
  • MSI 3.1 APIs added:
    • Installer.SetExternalUI(ExternalUIRecordHandler)
    • Installer.NotifySidChange
  • Code builds easier with .NET Famework 2.0
    • AugmentIL post-build step is no longer necessary when compiling the cabinet code against .NET Framework 2.0, which has builtin support for cdecl delegates.
    • All C# code compiles against .NET Framework 2.0 without obsolete warnings, when setting the NETFX2 preprocessor define.
    • Same code is still compatible with .NET Framework 1.0 + AugmentIL.
  • Miscellaneous bugfixes/changes:
    • InstallPackage.ExtractFiles could fail in some cominations of compressed/uncompressed files - fixed.
    • Installer.DeterminePatchSequence was broken due to an incorrect interop struct - fixed.
    • CabinetInfo and CabinetFileInfo classes made serializable.
    • Added Session.FormatString method to simplify formatting a string with property substitutions.
  • Documentation updates:
    • Updated all documentation for new CA proxy.
    • Added new topic discussing InstallUtil.


  • Documentation
    • Consolidated all documentation into a single CHM file.
    • Added new topics about working with MSI databases & cabinet files, to help new users get oriented more easily.
  • WindowsInstaller
    • Removed [Beta] tags from MSI 3.0 APIs, but otherwise there have been no changes since 3.0 Beta 1.
      • Be warned these are still the least-tested parts of the library, so early users may encounter bugs.
  • InstallPackage
    • Fixed InstallPackage.ExtractFiles() bug when directory doesn't exist.
    • Added ability to handle uncompressed files in a package marked as compressed.
  • Cabinet
    • Fixed improper handling of file attributes.
      • This bug caused some packages to not be extractable by other tools.
    • Added support for UTF filenames.
      • Non-ASCII filenames will automatically be stored as UTF-8. (But note most other tools don't know how to extract them.)


  • Cab
    • Fixed a bug introduced in v2.4.0 that caused files to be left in the %TEMP% directory after creating a cab.
    • Unsealed the CabinetInfo, CabinetFileInfo, CabinetStatus classes and made a few methods protected and virtual.
  • AugmentIL
    • Fixed a bug that sometimes caused a crash when specifying a relative output path on the command-line.
    • Fixed a bug that sometimes caused the Win32 version to be missing from the output file.
  • Samples\Diff: added new sample tool
    • Recursively diffs directories, MSIs, MSPs, CABs, other files.


  • Cab
    • Fixed a bug that caused compressing very large files/file sets to use way too much memory. Performance on large inputs is now within a few % of native cab tools (sometimes even a little faster!) for the same compression level.
  • WindowsInstaller
    • All the new MSI 3.0 beta APIs are wrapped, resulting in the following additions:
      • New classes - Product, Patch (for accessing sourcelist and other config)
      • New methods on Install class - GetProducts, GetPatches, RemovePatches, ApplyMultiplePatches, DetermineApplicablePatches, ExtractPatchXmlData
      • New enumerations - InstallContext, PatchStates, SourceType
      • Additional InstallProperty values
    • Note, MSI 3.0 support should be considered preliminary for now, as APIs (both native and managed) are subject to change.
    • For MSI 2.0 compatibility, developers should not use any classes or methods that are marked as [MSI 3.0 beta] in the documentation.
    • And unrelated to 3.0, a few additional enums have been added: DialogAttributes, ControlAttributes, CustomActionTypes, IniFileAction, RegistryRoot, RemoveFileInstallMode, ServiceControlEvents, ServiceInstallFlags, TextStyles, UpgradeAttributes, LocatorType
    • Also made a few minor non-breaking changes to keep the library FxCop-clean.
  • AugmentIL
    • Added support for strongname signing and delay-signing. AugmentIL tries to locate the keyfile using the AssemblyKeyFileAttribute, or you may specify the path with the new /key option.
    • All "released" assemblies will now be strongname-signed (with an unofficial key).
  • CAProxy
    • Added support for NativeDependencies property on CustomActionAttribute. This enables custom actions to P/Invoke into native DLLs that are carried with them.
  • Samples\SampleCAs
    • In SampleCA2, changed MessageBox.Show("") to session.Message(User,""), because generally it is a bad practice for CAs to show independent UI.
    • Added test of CustomActionAttribute.NativeDependencies functionality.
  • Samples\CabPack: added new sample
    • Demonstrates & tests the cab library by creating self-extracting packages
  • Samples\Inventory: added new sample
    • Shows a hierarchical, relational, searchable view of all of the product, feature, component, file, and patch data managed by MSI, for all products installed on the system.


  • Cab:
    • Added CabinetInfo.CompressDirectory method, capable of compressing an entire directory tree structure.
    • Updated documentation of various methods concerning support of directory structure inside cabs.
    • CabinetInfo case-sensitivity was inconsistent - now it is case-insensitive by default, though case is still preserved
    • Separated assembly attributes into assembly.cs
  • Msi:
    • InstallerException and subclasses automatically get extended error data from MSI's last-error-record when available. The data is stored in the exception and made available through the GetErrorRecord() method, and the exception's Message includes the formatted error message and data. This makes most exceptions extremely informative!
    • Added View.GetValidationErrors() method, and supporting ValidationErrorInfo struct and ValidationError enum. This wrapper for the MsiViewGetError API had been accidentally left out.
    • Session.Message() now supports message-box flags to specify buttons & icon
    • Added doc remarks to various methods about closing handles.
    • Separated assembly attributes into assembly.cs
  • AugmentIL:
    • Recent builds of ildasm v2.0.* have a slightly different output format, which could break AugmentIL in some cases - fixed
  • SampleCAs:
    • Removed 'using' clause from SampleCA1 -- there's no need to close the session's active database handle
  • Documentation:
    • Added note to ReadMe about compiling the cab source into another assembly


  • Cab:
    • CabinetInfo.IsValid() usually returned false even for valid cabs - fixed
    • Extracting cab files with null timestamps generated exception - fixed
  • Msi:
    • Added InstallCanceledException, subclass of InstallerException; Methods which may be canceled by the user can throw this exception
    • Added MessageResult enumeration; Used by Session.Message() and ExternalUIHandler delegate
    • Installer.EnableLog() now supports extended attributes correctly: Append mode and flush-every-line
    • Added Session.DoActionSequence() - This wrapper for the MsiSequence API had been accidentally left out
  • CAProxy:
    • Catches InstallCanceledException, returns ERROR_INSTALL_USEREXIT so CA developer doesn't necessarily have to handle the exception
  • Msi\Package:
    • Added TransformInfo class: metadata about an individual patch transform
    • Added PatchPackage.GetTransform*() methods which return TransformInfo
  • Documentation:
    • Added section to ReadMe.htm about building managed custom actions


  • Msi:
    • Validation didn't work on merge modules - fixed
  • CAProxy:
    • Was broken in 2.1 - fixed


  • Msi:
    • External UI handler didn't survive a garbage collection - fixed
    • Validation engine was completely broken - now it should work at least for MSIs which are already mostly valid
    • Added DynamicLoad property to CustomActionAttribute
      Usage: set DynamicLoad=false when using XmlSerialization; default is true
  • Msi\Package:
    • File extraction and update methods didn't work on merge modules - fixed
    • Made file update code slightly more robust
    • Removed hard-reference to the FilePatch assembly - now it is only loaded if working with binary file patches
  • AugmentIL:
    • AugmentIL would crash if some input files had read-only attr - fixed
    • Made /verbose switch slightly more verbose
  • CAProxy:
    • Added support for the DynamicLoad property of CustomActionAttribute
    • Added MMsiBreak debugging functionality - see doc
  • Samples\WiFile:
    • Added /l (list files) switch
  • Samples\SampleCAs:
    • In the makefile the comments about debug builds had an error; Now the sample builds debug packages (correctly) by default.
  • Documentation:
    • Wrote AugmentIL.htm describing the AugmentIL tool and its options.
    • Wrote WiFile.htm describing the WiFile sample tool.
    • Added section to ReadMe.htm about debugging managed custom actions.


  • Msi: Implemented the remaining APIs, also minor improvements and bugfixes
    • All published APIs are wrapped, with the exception of four: MsiGetFileSignatureInformation (because I don't know of a .NET analog for the returned certificate structure), and 3 APIs for previewing UI
    • Database.OpenView and Database.Execute* now take String.Format style params
    • Database.ApplyTransform can optionally use the error-suppression flags stored in the transform summary info
    • Added a few supporting enumerations and structures for the remaining APIs
    • InstallerException gets a descriptive message for any MSI or system error
    • Fixed a bug in InstallerException which would usually report "error 0"
    • Added optimization for setting a Record field to a MemoryStream
    • Record.GetStream is capable of extracting substorages
    • Moved InstallPath class to Microsoft.WindowsInstaller.Package assembly
  • Msi\FilePatch: added new project
    • Binary file patch API wrapper
  • Msi\Package: added new project
    • Helper classes for working with MSI and MSP packages
  • Cab: some minor bugfixes
    • Cabinet.Extract(stream, name) threw a NullReferenceException if the file didn't exist in the cab -- now it returns null
    • CabinetInfo.CompressFileSet() was broken -- fixed
    • If a Cabinet callback throws an exception, it is propogated as the inner-exception of the CabinetException
  • Samples\WiFile: added new sample
    • Demonstrates some features of InstallPackage class in Msi\Package project


  • Msi and Cab sources include complete C# XML documentation.
  • Msi and Cab makefiles generate XML documentation files.
  • Reference CHM compiled from XML documentation with NDoc.

I am aware that exceptions are still not documented in most areas. Other than that, feel free to send me a note if it's still not clear how to use parts of the API after reading the documentation.

Version is still 1.1 because there are no code changes in this release.


  • Msi: lots of small improvements for usability and consistency
    • Reworked ExternalUIHandler support
    • Added Installer properties/methods:
      • Components
      • ComponentClients()
      • ComponentState()
      • ComponentPath()
      • EnableLog()
    • Added Session.EvaluateCondition() method
    • Improved exception-handling in many methods in Installer, Database, & Session classes
    • Added extensive XML doc-comments to Installer, Database, View, & Session classes
    • A few breaking changes:
      • View.ModifyMode enumeration moved outside View and renamed ViewModifyMode
      • InstallLogMode enumeration renamed to InstallLogModes (naming convention for bitfields)
      • Record constructor takes arbitrary number of parameters
  • AugmentIL: almost completely rewritten
    • Ildasm/ilasm steps are built-in
      • The round-trip can be done in one step
      • IL source input/output is still supported
    • Never throws an unhandled exception
    • Organized command-line options, consistent with other .NET tools
    • Uses a plugin architecture to allow additional augmentations
  • CAProxy: Added AIL_CAProxy.cs - AugmentIL plugin generates CA proxy methods
  • SampleCAs: Updated makefile for new AugmentIL usage


  • ReadMe.htm: Added section on writing managed CAs
  • SampleCAs: Added missing reference to System.Windows.Forms.dll to the makefile
  • AugmentIL: Added specific warning messages for when CA method has wrong signature
  • Put sources in Toolbox-hosted Source Depot.


Initial posting to http://toolbox