While troubleshooting some recent problems with an application requiring .NET 3.5 SP1, it was determined the installation was not correctly testing for the Service Pack, only .NET 3.5. After a little research on the issue, I found in the .NET Framework forums there is an issue where the .NET Framework Launch Condition does not have the ability to check for Service Pack levels. At this point, it became fairly obvious a Launch Condition was needed. Launch Conditions provide the ability to check registry values, installed applications or files to determine if the application can continue to be installed on the target machine.
Over the years, there have been many hacks and methods for checking the registry to determine whether a service pack has been installed, whether it’s for an operating system or the .NET Framework. The good news is the .NET Framework now makes it much easier to determine whether a service pack is installed. Verifying whether .NET Framework 3.5 Service Pack 1 is installed can be accomplished by checking the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5 registry key for the SP value (DWORD). Simply, if this value does not exist or is 0, a service pack for .NET 3.5 is not installed. If a number is present, it is the Service Pack number currently installed.
With this knowledge in mind, it’s just a matter of adding a Search and Launch Condition to the setup. To view the Launch Conditions tab, right-click on the setup in Solution Explorer, select View->Launch Conditions. The Launch Conditions tab will display. You will first want to add the criteria for searching for the service pack. Right-click on the “Search Target Machine” node, then select “Add Registry Search.” This will add a child node named “Search for RegistryEntry1” by default. Rename the child node to “Search for .NET 3.5 Service Pack Version.”
Now you can add a Search for the service pack in the installer and store it in a property named "SERVICEPACK." In addition to the Property setting, add the RegKey and Value settings as shown below:
Similar to the Search criteria, you will need to add the criteria for the Launch Conditions. Right-click on the “Launch Conditions” node, then select “Add Launch Condition.” This will add a child node named “Condition1” by default. Rename the child node to “Check for .NET 3.5 Service Pack Version.”

The critical setting for the Launch Condition is the Condition value in the Properties. This value needs to be set to NOT(SERVICEPACK="") AND NOT(SERVICEPACK>>"0"). The interesting part of this setting is a result of “SP” being of type DWORD in the registry. Because the MSI will prefix DWORD registry values with a “#” sign, the SERVICEPACK property above will contains a “#0” or “#1” string value, instead of the service pack number. Hence, the Condition will first check to see if the property exists in the registry, then the substring operator “>>” is used to insure the property does not end with a “0.” This will allow the launch condition check to succeed if subsequent service packs are installed, at least up to service pack 10, however, unlikely that would be. In the event, the setup is launched without .NET 3.5 Service Pack 1 previously installed, a dialog will display the value for Message.
Hope this helps!