private void AutomaticallySlipstreamPatches(Output bundle, ICollection<ChainPackageInfo> packages) { List<ChainPackageInfo> msiPackages = new List<ChainPackageInfo>(); Dictionary<string, List<WixBundlePatchTargetCodeRow>> targetsProductCode = new Dictionary<string, List<WixBundlePatchTargetCodeRow>>(); Dictionary<string, List<WixBundlePatchTargetCodeRow>> targetsUpgradeCode = new Dictionary<string, List<WixBundlePatchTargetCodeRow>>(); foreach (ChainPackageInfo package in packages) { if (Compiler.ChainPackageType.Msi == package.ChainPackageType) { // Keep track of all MSI packages. msiPackages.Add(package); } else if (Compiler.ChainPackageType.Msp == package.ChainPackageType && package.Slipstream) { // Index target ProductCodes and UpgradeCodes for slipstreamed MSPs. foreach (WixBundlePatchTargetCodeRow row in package.TargetCodes) { if (row.TargetsProductCode) { List<WixBundlePatchTargetCodeRow> rows; if (!targetsProductCode.TryGetValue(row.TargetCode, out rows)) { rows = new List<WixBundlePatchTargetCodeRow>(); targetsProductCode.Add(row.TargetCode, rows); } rows.Add(row); } else if (row.TargetsUpgradeCode) { List<WixBundlePatchTargetCodeRow> rows; if (!targetsUpgradeCode.TryGetValue(row.TargetCode, out rows)) { rows = new List<WixBundlePatchTargetCodeRow>(); targetsUpgradeCode.Add(row.TargetCode, rows); } } } } } Table slipstreamMspTable = bundle.EnsureTable(this.core.TableDefinitions["SlipstreamMsp"]); RowDictionary<Row> slipstreamMspRows = new RowDictionary<Row>(slipstreamMspTable); // Loop through the MSI and slipstream patches targeting it. foreach (ChainPackageInfo msi in msiPackages) { List<WixBundlePatchTargetCodeRow> rows; if (targetsProductCode.TryGetValue(msi.ProductCode, out rows)) { foreach (WixBundlePatchTargetCodeRow row in rows) { Row slipstreamMspRow = slipstreamMspTable.CreateRow(row.SourceLineNumbers, false); slipstreamMspRow[0] = msi.Id; slipstreamMspRow[1] = row.MspPackageId; if (slipstreamMspRows.TryAdd(slipstreamMspRow)) { slipstreamMspTable.Rows.Add(slipstreamMspRow); } } rows = null; } if (!String.IsNullOrEmpty(msi.UpgradeCode) && targetsUpgradeCode.TryGetValue(msi.UpgradeCode, out rows)) { foreach (WixBundlePatchTargetCodeRow row in rows) { Row slipstreamMspRow = slipstreamMspTable.CreateRow(row.SourceLineNumbers, false); slipstreamMspRow[0] = msi.Id; slipstreamMspRow[1] = row.MspPackageId; if (slipstreamMspRows.TryAdd(slipstreamMspRow)) { slipstreamMspTable.Rows.Add(slipstreamMspRow); } } rows = null; } } }