Windows Installer packages should always 'install' every component that they include. The Windows Installer runtime will decide whether or not to install a file. It records every package that installs a component and only removes the component when no references remain. Be very aware that Windows Installer makes these decisions on a component GUID basis, not by using file paths. If one file has a different GUID in different packages, when one is uninstalled, Windows Installer will decide that the file is no longer used and will remove it, breaking the other installation. For this reason any shared files installed to the same location should always have the same GUID. The only way to do this in Visual Studio's setup packages, that I'm aware of, is to create a Merge Module containing the shared components and include that Merge Module in all install packages. I believe Windows Installer counts references to assemblies installed in the GAC separately, so I think it's safe to install the same assembly to the GAC using different references. Still, it's better to follow the same pattern throughout. In general, you should follow the supplier's advice for installing any third-party components. That may well mean running their installer before yours. Best practice in my view is to install everything into your own private binary folder. You should avoid strong naming, in my opinion, as that will cause lookups in the GAC even if the file is in the binary folder. If you aren't versioning your assemblies correctly, an administrator can break your application by putting the assembly in the GAC, as the GAC takes precedence over local folders for strong-named assemblies.
DoEvents: Generating unexpected recursion since 1991