/// <summary> /// Process TargetFrameworkDirectories and an array of InstalledAssemblyTables. /// The goal is this: for each installed assembly table (whether found on disk /// or given as an input), we wish to determine the target framework directory /// it is associated with. /// </summary> /// <returns>Array of AssemblyTableInfo objects (Describe the path and framework directory of a redist or subset list xml file) </returns> private AssemblyTableInfo[] GetInstalledAssemblyTableInfo(bool ignoreInstalledAssemblyTables, ITaskItem[] assemblyTables, GetListPath GetAssemblyListPaths, string[] targetFrameworkDirectories) { Dictionary<string, AssemblyTableInfo> tableMap = new Dictionary<string, AssemblyTableInfo>(StringComparer.OrdinalIgnoreCase); if (!ignoreInstalledAssemblyTables) { // first, find redist or subset files underneath the TargetFrameworkDirectories foreach (string targetFrameworkDirectory in targetFrameworkDirectories) { string[] listPaths = GetAssemblyListPaths(targetFrameworkDirectory); foreach (string listPath in listPaths) { tableMap[listPath] = new AssemblyTableInfo(listPath, targetFrameworkDirectory); } } } // now process those provided as inputs from the project file foreach (ITaskItem installedAssemblyTable in assemblyTables) { string frameworkDirectory = installedAssemblyTable.GetMetadata(ItemMetadataNames.frameworkDirectory); // Whidbey behavior was to accept a single TargetFrameworkDirectory, and multiple // InstalledAssemblyTables, under the assumption that all of the InstalledAssemblyTables // were related to the single TargetFrameworkDirectory. If inputs look like the Whidbey // case, let's make sure we behave the same way. if (String.IsNullOrEmpty(frameworkDirectory)) { if (TargetFrameworkDirectories != null && TargetFrameworkDirectories.Length == 1) { // Exactly one TargetFrameworkDirectory, so assume it's related to this // InstalledAssemblyTable. frameworkDirectory = TargetFrameworkDirectories[0]; } } else { // The metadata on the item was non-empty, so use it. frameworkDirectory = FileUtilities.EnsureTrailingSlash(frameworkDirectory); } tableMap[installedAssemblyTable.ItemSpec] = new AssemblyTableInfo(installedAssemblyTable.ItemSpec, frameworkDirectory); } AssemblyTableInfo[] extensions = new AssemblyTableInfo[tableMap.Count]; tableMap.Values.CopyTo(extensions, 0); return extensions; }
private AssemblyTableInfo[] GetInstalledAssemblyTableInfo(bool ignoreInstalledAssemblyTables, ITaskItem[] assemblyTables, GetListPath GetAssemblyListPaths, string[] targetFrameworkDirectories) { Dictionary<string, AssemblyTableInfo> dictionary = new Dictionary<string, AssemblyTableInfo>(StringComparer.OrdinalIgnoreCase); if (!ignoreInstalledAssemblyTables) { foreach (string str in targetFrameworkDirectories) { foreach (string str2 in GetAssemblyListPaths(str)) { dictionary[str2] = new AssemblyTableInfo(str2, str); } } } foreach (ITaskItem item in assemblyTables) { string metadata = item.GetMetadata("FrameworkDirectory"); if (string.IsNullOrEmpty(metadata)) { if ((this.TargetFrameworkDirectories != null) && (this.TargetFrameworkDirectories.Length == 1)) { metadata = this.TargetFrameworkDirectories[0]; } } else { metadata = Microsoft.Build.Shared.FileUtilities.EnsureTrailingSlash(metadata); } dictionary[item.ItemSpec] = new AssemblyTableInfo(item.ItemSpec, metadata); } AssemblyTableInfo[] array = new AssemblyTableInfo[dictionary.Count]; dictionary.Values.CopyTo(array, 0); return array; }