Exemplo n.º 1
0
        /// <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;
 }