I’ve recently discovered a weird InstallShield 2010 setup.exe behavior while doing some extensive testing for a client’s installer. Basically on a Windows 7 (x64) machine that I knew should need several redists, only one of the redists would show as needing to be installed. When I ran the setup.exe again all three would show up as needing to be installed.
I did some googling and found out that setup.exe has a /debuglog option that allows you to diagnosis setup.exe problems. I decided to do this and compare the bad then good logs. Doing so revealed the following:
Skipping prerequisite ‘Microsoft Visual C++ 2010 Redistributable Package (x86).prq’ because it was installed before the reboot
Funny, I’ve never installed this prereq. I did some googling and found a thread over on InstallShield Community where another user was seeing a similar behavior.
Now the machine I was testing on was a VM snapshot. And it was only this one snapshot that I could reproduce the problem on. I started thinking about how this could be and I think I’ve figured out the scenario that surfaces this design defect. I had created a build for my customer that had several prereqs and used that to create the snapshot. My customer then added additional dependencies to the application so I created a new build that added a couple more prereqs and I scheduled them to be run before some of the prexisting prereqs. In doing so I think I stumbled into a situation where InstallShield keeps some information around and incorrectly figures it’s installed something before that it hasn’t.
So just be aware, if your doing setup prereq work and using snapshots for performance / productivity purposes while testing edge cases with setup prereqs that you might come across this problem. To be extra safe, always author AppSearch / LaunchConditions to make sure the problem isn’t swallowed and resurfaced when you try to run the application.
If anyone would like to help me confirm this bug, please consider trying to do the following:
1) Build setup.exe v1 with prereq A
2) Build setup.exe v2 with prereq A and prereq B. Sequence prereq B to run before A.
3) Create a VM and create snapshot 1.
4) Run setup.exe v1 on the VM against snapshot 1 to install prereq A.
5) Create snapshot 2
6) Run setup.exe v2 on the vm . You’ll see prereq b ommitted from the list and /debuglog shows it’s being skipped
7) Run setup.exe v2 again on the vm. You’ll see prereq b in the list and skipping emitted from the log.
8) Apply snapshot 1 and run setup.exe v2. You’ll see prereq a and b in the list.
9) Apply v2 and repeat steps 6 and 7. It should be very predictable.