Creating Patch Installers

Windows Installer Technology allows for MSP Patch installers, which compliment your MSI installers really well.  However, Visual Studio doesn't support the creation of them from within the IDE.  In fact, you have to download the Windows SDK Toolkit and use a utility called MSIMSP.  For this process, you will also need a utility called Orca from the same SDK; when you download the SDK, inside the Bin folder is an Orca.msi installer.

What you do is build the original version of your MSI installer; then you make the necessary changes and/or fixes to your product and recreate another MSI installer representing the new version of your product.  Then you pass these two MSI installers to the MSIMSP utility and it creates an MSP patch installer for you by automatically detecting the binary differences between the two MSI installers.

I used this article as a guide:  http://www.codeproject.com/KB/install/dotnetpatching.aspx

However, the Platform SDK link in the article is broken, so use this one instead:  http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en

This isn't the most up-to-date Windows SDK, but the batch script in the CodeProject article relies on this specific versions folder structure (it has everything you need to create the MSP patch installer nicely in one folder, whereas the newest SDK does not).

I did run into a few of the same hiccups that others did (found down below in the comments of the CodeProject article).  Here are links to my posts with the solutions (you'll have to click around each thread to see the problems posted before my posts):

Also, I had to modify his patch.cmd batch file slightly; a copy of it is pasted below.

This process isn't as effective as it should be if you are trying to difference two Visual Studio created MSI installers.  The MSIMSP utility is very thorough in its comparison of file names, locations, sizes, versions, and every byte of data contained in the files.  It can create a binary difference between the two files in order to minimize as much as possible the patch installer's size and speed.  It even compares the 8.3 short filename of every file.  Unfortunately, Visual Studio can be very inconsistent in its assignment of short filenames with the tilde-numbering system (i.e., "FILENA~3.TXT") if you add, rename, move, or delete even a couple of files from your project.  I often had to manually edit the short filenames in the second MSI using the Orca utility to make the names be consistent between the two versions of the Visual Studio created installers; otherwise, the MSIMSP utility would just blindly include the whole file for patching and inflate the overall size of the MSP patcher.

Good luck and enjoy not having to figure out what the deltas are between the versions of your products!

if "%1"=="" %0 Debug Release Done 

@SETLOCAL
@set path=%path%;"C:\Program Files\Microsoft Platform SDK\Samples\SysMgmt\Msi\Patching"
@set PatchTmp=C:\VSTemp

: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
View Full Article

Catastrophic Failure

So I got a "Catastrophic Failure" in the Silverlight 2 beta 1 designer in VS 2008 this morning.  Have no clue what it means, but it seemed temporary (I was in the middle of typing in the XAML view and the designer didn't like something I did).  Here is a screenshot, it's pretty amusing:

screenshot

View Full Article