I added the functionality to enumerate install references of GAC assemblies to the managed GAC API wrappers.
Meanwhile I added some comments in UninstallAssembly to explain the behavior David Levine saw. It is really about what is fully specified name, and what is partially specified name. If we convinced the input is fully specified, we will only look in the corresponding GAC. Otherwise, we believe the input is partially specified, and a random assembly (matching the partially specified name) is uninstalled. NEVER NEVER use partially specified name in UninstallAssembly/QueryAssemblyInfo.
Many thanks to David Levine, for providing his implementation as references. My goal here is to expose only GAC related operations. So your implementation may differ from mine.