Click here to Skip to main content
15,868,141 members
Articles / Mobile Apps
Article

How to create installation patches for VS.NET deployment projects

Rate me:
Please Sign up or sign in to vote.
4.33/5 (16 votes)
28 Oct 20054 min read 781.7K   100   158
Automaticaly create Windows installer patches.

Introduction

I found myself wondering how to create patches for my application. I looked at several third-party tools like Wise and InstallShield and some freeware installers and found that they were all overkill for what I needed. My distribution needs were simple, but my projects were large. I clearly needed a way to easily create patches.

The VS.NET deployment project is very easy to use, much easier than working with the Windows Installer SDK directly. This ease of use comes at a cost; VS.NET deployment projects eliminate many of the features and flexibility of the SDK in order to simplify the build process.

After reviewing the Windows Platform SDK documentation and several examples on MSDN I came up with this automatic build process for creating a MSP patch file.

Using the code

This procedure creates patch.msp files which contain the differences between the VS.NET deployment project current Release and Debug installers and the original installers you will place in a TargetImages folder. It requires that the VS.NET deployment project build properties be set to Package files=In setup file.

  1. Install the Microsoft Platform SDK.
  2. Install Orca.Msi located at C:\Program Files\Microsoft Platform SDK\Bin\.
  3. Copy TEMPLATE.PCP located at C:\Program Files\Microsoft Platform SDK\Samples\SysMgmt\Msi\Patching\ to your deployment project folder and rename it to patch.pcp.
  4. Double click the patch.pcp file to open it in ORCA.
  5. Add a record to the ImageFamilies table and set Family to fam1.
  6. Add a record to the PatchSequence table and set PatchFamily to fam1 and Sequence to 1.0.0.
  7. In the Properties table, select the value for PatchGUID and right click it. Select paste new GUID.
  8. In the Properties table, select the value for PatchOutputPath and set its value to Patch\patch.msp.
  9. Add a record to the Properties table and set its name to MinimumRequiredMsiVersion and its value to 200.
  10. Add a record to the TargetImages table and set these values: Target=target, MsiPath=TargetImage\setup.msi, Upgraded=upgrade, Order=1, IgnoreMissingSrcFiles=0.
  11. Add a record to the UpgradedImages table and set these values: Upgraded=upgrade, MsiPath=UpgradedImage\setup.msi, Family=fam1.
  12. Create a TargetImage\Release folder in your deployment project folder and copy the installer MSI of your first release install into it.
  13. Create a TargetImage\Debug folder in your deployment project folder and copy the installer MSI of your first debug install into it. If you do not create and distribute debug installs you can skip this step.
  14. Create a new patch.cmd file in your deployment project folder and add the following commands to it:
    if "%1"=="" %0 Debug Release Done 
    
    @SETLOCAL 
    @set path=%path%;"C:\Program Files\Microsoft Platform 
                         SDK\Samples\SysMgmt\Msi\Patching"
    @set PatchTmp=C:\~VSTMP 
    
    :loop 
    if "%1"=="Done" goto end 
    
    if not exist %1\*.msi goto nopatch 
    if not exist TargetImage\%1\*.msi goto nopatch 
    
    :ok 
    rmdir /s /q %PatchTmp% 
    mkdir %PatchTmp% 
    mkdir %PatchTmp%\TargetImage 
    mkdir %PatchTmp%\UpgradedImage 
    mkdir %PatchTmp%\Patch 
    
    for %%a in (TargetImage\%1\*.msi) do copy %%a %PatchTmp%\setup.msi 
    msiexec /qb /a %PatchTmp%\setup.msi TARGETDIR=%PatchTmp%\TargetImage 
                                     /L*v %PatchTmp%\TargetImage\setup.log 
    del %PatchTmp%\setup.msi 
    
    for %%a in (%1\*.msi) do copy %%a %PatchTmp%\setup.msi 
    msiexec /qb /a %PatchTmp%\setup.msi TARGETDIR=%PatchTmp%\UpgradedImage 
                                    /L*v %PatchTmp%\UpgradedImage\setup.log 
    del %PatchTmp%\setup.msi 
    
    copy patch.pcp %PatchTmp% 
    set PatchDir=%CD% 
    chdir %PatchTmp% 
    msimsp -s patch.pcp -p Patch\patch.msp -l Patch\patch.log 
                                                   -f %PatchTmp%\Tmp -d 
    
    rmdir /s /q %PatchTmp%\TargetImage 
    rmdir /s /q %PatchTmp%\UpgradedImage 
    rmdir /s /q %PatchTmp%\Tmp 
    chdir %PatchDir% 
    
    mkdir Patch 
    mkdir Patch\%1 
    copy %PatchTmp%\Patch\*.* Patch\%1\*.* 
    rmdir /s /q %PatchTmp% 
    
    :nopatch 
    shift 
    goto loop 
    
    :end 
    pause
  15. Edit your deployment project and change the version property. This is required so that the patch compiler (msimsp.exe ) sees a different version. Important: When it asks to update the ProductCode and PackageCode, you must answer No. PackageCode is a hidden property which VS.NET automatically updates each time you build the deployment project; but, ProductCode must not be changed for the patch compiler to work. The patch compiler will refuse to create working patches of major upgrades and it determines this by the ProductCode being changed, not by the Version number.
  16. Build your deployment project. If you use both Debug and Release configurations be sure to build both of them. The fact that the UpgradeCode and ProductCode have not changed, and the hidden PackageCode has changed will indicate to patch compiler that the updated version is a minor update instead of a major upgrade.
  17. Run the patch.cmd batch program. This process can take several minutes to complete depending upon the size and complexity of your original deployment projects. The patch compiler will compare each file in both setup projects to determine which files have changed and either create a delta between the files, or include the whole file if there are too many changes. Be sure to check the patch.log files to see what files were included in your patch and to be sure everything compiled correctly with no errors.

Points of interest

If you use configurations with names other than Release and Debug, you will need to modify line 1 of the patch.cmd file to name the configurations you use, but make sure Done is specified as the last word on that line so that the command will exit properly.

You can specify different locations for your msimsp.exe file and the temporary folder to use by editing the set commands at the beginning of the batch program. Note that the PatchTmp variable specifies a folder which will be totally created and totally deleted by this batch program, so don't specify a temp folder needed by Windows or any other program. I also recommend specifying a temporary location with as short a name as possible. I have had problems running msimsp in folders with very long full path names.

History

  • August 20th, 2005 - Initial version.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Systems Engineer Mark J Means Consulting
United States United States
I have been a software consultant since 1985 working on everything from the Commodore VIC-20 & RadioShack CoCo games to 8051 Embedded USB Microcontrollers to Windows Vista database applications. I have written over a half million lines of code since 2004. Please see my DataConnectionDialog control at http://mjmeans.com/dcd.aspx.

Comments and Discussions

 
Question<pre>Failed to create patch. Error code: 0x7E </pre> Pin
Member 1279735224-Jan-17 1:26
Member 1279735224-Jan-17 1:26 
AnswerRe: <pre>Failed to create patch. Error code: 0x7E </pre> Pin
Olga Shomonko10-Jun-21 23:43
Olga Shomonko10-Jun-21 23:43 
QuestionError code 2356 when installing msp Pin
nehak.8514-Oct-13 7:12
nehak.8514-Oct-13 7:12 
GeneralPatch does not change the most important file Pin
Member 777923923-Mar-11 5:37
Member 777923923-Mar-11 5:37 
GeneralRe: Patch does not change the most important file Pin
mjmeans23-Mar-11 16:21
mjmeans23-Mar-11 16:21 
QuestionDoesn't seem to work? Pin
jprizzo10-Jan-11 2:48
jprizzo10-Jan-11 2:48 
AnswerRe: Doesn't seem to work? Pin
mjmeans10-Jan-11 4:37
mjmeans10-Jan-11 4:37 
My guess is that you didn't update the assembly file version of the changed DLL. I read somewhere that when msimsp compares the two msi files to determine that a DLL has changed in order to create the patch it only looks at the file version number attributes, not the date/time or size. Make sure the AssemblyFileVersion attribute is updated for each build, or make sure it is blank (which will cause VS to inherit the AsssemblyVersion Attribute) and update the AssemblyVersion attribute with each build.
GeneralRe: Doesn't seem to work? Pin
jprizzo11-Jan-11 9:12
jprizzo11-Jan-11 9:12 
GeneralRe: Doesn't seem to work? Pin
mjmeans11-Jan-11 14:42
mjmeans11-Jan-11 14:42 
GeneralRe: Doesn't seem to work? Pin
Member 855516910-Jan-12 2:31
Member 855516910-Jan-12 2:31 
GeneralRe: Doesn't seem to work? Pin
Bhaskar Priya24-Apr-12 23:17
Bhaskar Priya24-Apr-12 23:17 
GeneralPatch Api could not create a small patch after i move the source code. Pin
narutox2222-Dec-10 21:41
narutox2222-Dec-10 21:41 
GeneralUninstalling msp patch causes incorrect file deletion - help please. Pin
madskills123456721-Jul-10 5:05
madskills123456721-Jul-10 5:05 
GeneralUpdate Patch Issue. Pin
rafiq_22jmr23-Jan-10 6:16
rafiq_22jmr23-Jan-10 6:16 
GeneralProblem while applying patch on patch... Pin
MaheshPeddi12-Jan-10 4:06
MaheshPeddi12-Jan-10 4:06 
GeneralRe: Problem while applying patch on patch... Pin
Member 416944518-Jul-12 0:53
Member 416944518-Jul-12 0:53 
GeneralRe: Problem while applying patch on patch... Pin
dresha4827-Dec-12 9:45
dresha4827-Dec-12 9:45 
GeneralRe: Problem while applying patch on patch... Pin
dresha4827-Dec-12 10:59
dresha4827-Dec-12 10:59 
GeneralWhen applying DLL its not updating with modified size. Pin
MaheshPeddi11-Jan-10 2:59
MaheshPeddi11-Jan-10 2:59 
QuestionCannot override TARGETDIR when using msiexec /a to create a network installation of an ASP.NET application? Pin
Globulus16-Nov-09 5:46
Globulus16-Nov-09 5:46 
AnswerRe: Cannot override TARGETDIR when using msiexec /a to create a network installation of an ASP.NET application? Pin
mjmeans16-Nov-09 20:35
mjmeans16-Nov-09 20:35 
QuestionModifying Patch Creation Properties (.pcp) file programmatically? Pin
Globulus16-Nov-09 5:44
Globulus16-Nov-09 5:44 
AnswerRe: Modifying Patch Creation Properties (.pcp) file programmatically? Pin
mjmeans16-Nov-09 20:39
mjmeans16-Nov-09 20:39 
QuestionHow to avoid Repair setup/Remove setup message window when using patch Pin
rafiq_22jmr9-Oct-09 7:32
rafiq_22jmr9-Oct-09 7:32 
AnswerRe: How to avoid Repair setup/Remove setup message window when using patch Pin
mjmeans9-Oct-09 7:47
mjmeans9-Oct-09 7:47 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.