You can use the MSI api functions to list all installed products. Below you will find sample code that does this.
In my code, I first list all the products, get the product name and, if it contains the string "Visual Studio", I check the InstallLocation property. However, this property is not always set. I donβt know for sure if this is the wrong property to check or if there is another property that always contains the target directory. Maybe the information obtained from the InstallLocation property is sufficient for you?
using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; class Program { [DllImport("msi.dll", CharSet = CharSet.Unicode)] static extern Int32 MsiGetProductInfo(string product, string property, [Out] StringBuilder valueBuf, ref Int32 len); [DllImport("msi.dll", SetLastError = true)] static extern int MsiEnumProducts(int iProductIndex, StringBuilder lpProductBuf); static void Main(string[] args) { StringBuilder sbProductCode = new StringBuilder(39); int iIdx = 0; while ( 0 == MsiEnumProducts(iIdx++, sbProductCode)) { Int32 productNameLen = 512; StringBuilder sbProductName = new StringBuilder(productNameLen); MsiGetProductInfo(sbProductCode.ToString(), "ProductName", sbProductName, ref productNameLen); if (sbProductName.ToString().Contains("Visual Studio")) { Int32 installDirLen = 1024; StringBuilder sbInstallDir = new StringBuilder(installDirLen); MsiGetProductInfo(sbProductCode.ToString(), "InstallLocation", sbInstallDir, ref installDirLen); Console.WriteLine("ProductName {0}: {1}", sbProductName, sbInstallDir); } } } }
source share