internal void Read(XmlTextReader reader)
        {
            ArrayList list = new ArrayList();

            if (this.bindingRedirects != null)
            {
                list.AddRange(this.bindingRedirects);
            }
            while (reader.Read())
            {
                if ((reader.NodeType == XmlNodeType.EndElement) && AppConfig.StringEquals(reader.Name, "dependentassembly"))
                {
                    break;
                }
                if ((reader.NodeType == XmlNodeType.Element) && AppConfig.StringEquals(reader.Name, "assemblyIdentity"))
                {
                    string str  = null;
                    string str2 = "null";
                    string str3 = "neutral";
                    while (reader.MoveToNextAttribute())
                    {
                        if (AppConfig.StringEquals(reader.Name, "name"))
                        {
                            str = reader.Value;
                        }
                        else
                        {
                            if (AppConfig.StringEquals(reader.Name, "publicKeyToken"))
                            {
                                str2 = reader.Value;
                                continue;
                            }
                            if (AppConfig.StringEquals(reader.Name, "culture"))
                            {
                                str3 = reader.Value;
                            }
                        }
                    }
                    string assemblyName = string.Format(CultureInfo.InvariantCulture, "{0}, Version=0.0.0.0, Culture={1}, PublicKeyToken={2}", new object[] { str, str3, str2 });
                    try
                    {
                        this.partialAssemblyName = new AssemblyNameExtension(assemblyName).AssemblyName;
                    }
                    catch (FileLoadException exception)
                    {
                        Microsoft.Build.Shared.ErrorUtilities.VerifyThrowArgument(false, exception, "AppConfig.InvalidAssemblyIdentityFields");
                    }
                }
                if ((reader.NodeType == XmlNodeType.Element) && AppConfig.StringEquals(reader.Name, "bindingRedirect"))
                {
                    BindingRedirect redirect = new BindingRedirect();
                    redirect.Read(reader);
                    list.Add(redirect);
                }
            }
            this.bindingRedirects = (BindingRedirect[])list.ToArray(typeof(BindingRedirect));
        }
 internal void Read(XmlTextReader reader)
 {
     ArrayList list = new ArrayList();
     if (this.bindingRedirects != null)
     {
         list.AddRange(this.bindingRedirects);
     }
     while (reader.Read())
     {
         if ((reader.NodeType == XmlNodeType.EndElement) && AppConfig.StringEquals(reader.Name, "dependentassembly"))
         {
             break;
         }
         if ((reader.NodeType == XmlNodeType.Element) && AppConfig.StringEquals(reader.Name, "assemblyIdentity"))
         {
             string str = null;
             string str2 = "null";
             string str3 = "neutral";
             while (reader.MoveToNextAttribute())
             {
                 if (AppConfig.StringEquals(reader.Name, "name"))
                 {
                     str = reader.Value;
                 }
                 else
                 {
                     if (AppConfig.StringEquals(reader.Name, "publicKeyToken"))
                     {
                         str2 = reader.Value;
                         continue;
                     }
                     if (AppConfig.StringEquals(reader.Name, "culture"))
                     {
                         str3 = reader.Value;
                     }
                 }
             }
             string assemblyName = string.Format(CultureInfo.InvariantCulture, "{0}, Version=0.0.0.0, Culture={1}, PublicKeyToken={2}", new object[] { str, str3, str2 });
             try
             {
                 this.partialAssemblyName = new AssemblyNameExtension(assemblyName).AssemblyName;
             }
             catch (FileLoadException exception)
             {
                 Microsoft.Build.Shared.ErrorUtilities.VerifyThrowArgument(false, exception, "AppConfig.InvalidAssemblyIdentityFields");
             }
         }
         if ((reader.NodeType == XmlNodeType.Element) && AppConfig.StringEquals(reader.Name, "bindingRedirect"))
         {
             BindingRedirect redirect = new BindingRedirect();
             redirect.Read(reader);
             list.Add(redirect);
         }
     }
     this.bindingRedirects = (BindingRedirect[]) list.ToArray(typeof(BindingRedirect));
 }
Esempio n. 3
0
        /// <summary>
        /// Based on the closure, get a table of ideal remappings needed to 
        /// produce zero conflicts.
        /// </summary>
        internal void ResolveConflicts
        (
            out DependentAssembly[] idealRemappings,
            out AssemblyNameReference[] conflictingReferences
        )
        {
            idealRemappings = null;
            conflictingReferences = null;

            // First, resolve all conflicts between references.
            if (0 == ResolveConflictsBetweenReferences())
            {
                // If there were no basename conflicts then there can be no version-to-version conflicts.
                // In this case, short-circuit now rather than building up all the tables below.
                return;
            }

            // Build two tables, one with a count and one with the corresponding references.
            // Dependencies which differ only by version number need a suggested redirect.
            // The count tells us whether there are two or more.
            Hashtable counts = new Hashtable(StringComparer.OrdinalIgnoreCase);
            Hashtable references = new Hashtable(StringComparer.OrdinalIgnoreCase);

            foreach (AssemblyNameExtension assemblyName in References.Keys)
            {
                Reference reference = GetReference(assemblyName);

                // If the assembly has a parent which has specific version set to true then we need to see if it is framework assembly
                if (reference.CheckForSpecificVersionMetadataOnParentsReference(true))
                {
                    // Try and find an entry in the redist list by comparing everything except the version.
                    AssemblyEntry entry = null;

                    if (_installedAssemblies != null)
                    {
                        entry = _installedAssemblies.FindHighestVersionInRedistList(assemblyName);
                    }

                    if (entry != null)
                    {
                        // We have found an entry in the redist list that this assembly is a framework assembly of some version
                        // also one if its parent refernces has specific version set to true, therefore we need to make sure
                        // that we do not consider it for conflict resolution.
                        continue;
                    }
                }

                byte[] pkt = assemblyName.GetPublicKeyToken();
                if (pkt != null && pkt.Length > 0)
                {
                    AssemblyName baseKey = (AssemblyName)assemblyName.AssemblyName.Clone();
                    Version version = baseKey.Version;
                    baseKey.Version = null;
                    string key = baseKey.ToString();

                    if (counts.ContainsKey(key))
                    {
                        counts[key] = ((int)counts[key]) + 1;
                        Version lastVersion = ((AssemblyNameReference)references[key]).assemblyName.Version;

                        if (lastVersion == null || lastVersion < version)
                        {
                            references[key] = AssemblyNameReference.Create(assemblyName, reference);
                        }
                    }
                    else
                    {
                        counts[key] = 1;
                        references[key] = AssemblyNameReference.Create(assemblyName, reference);
                    }
                }
            }

            // Build the list of conflicted assemblies.
            List<AssemblyNameReference> assemblyNamesList = new List<AssemblyNameReference>();
            foreach (string versionLessAssemblyName in counts.Keys)
            {
                if (((int)counts[versionLessAssemblyName]) > 1)
                {
                    assemblyNamesList.Add((AssemblyNameReference)references[versionLessAssemblyName]);
                }
            }

            // Pass over the list of conflicting references and make a binding redirect for each.
            List<DependentAssembly> idealRemappingsList = new List<DependentAssembly>();

            foreach (AssemblyNameReference assemblyNameReference in assemblyNamesList)
            {
                DependentAssembly remapping = new DependentAssembly();
                remapping.PartialAssemblyName = assemblyNameReference.assemblyName.AssemblyName;
                BindingRedirect bindingRedirect = new BindingRedirect();
                bindingRedirect.OldVersionLow = new Version("0.0.0.0");
                bindingRedirect.OldVersionHigh = assemblyNameReference.assemblyName.AssemblyName.Version;
                bindingRedirect.NewVersion = assemblyNameReference.assemblyName.AssemblyName.Version;
                remapping.BindingRedirects = new BindingRedirect[] { bindingRedirect };

                idealRemappingsList.Add(remapping);
            }

            idealRemappings = idealRemappingsList.ToArray();
            conflictingReferences = assemblyNamesList.ToArray();
        }
Esempio n. 4
0
        /// <summary>
        /// The reader is positioned on a &lt;dependentassembly&gt; element--read it.
        /// </summary>
        /// <param name="reader"></param>
        internal void Read(XmlTextReader reader)
        {
            ArrayList redirects = new ArrayList();

            if (_bindingRedirects != null)
            {
                redirects.AddRange(_bindingRedirects);
            }

            while (reader.Read())
            {
                // Look for the end element.
                if (reader.NodeType == XmlNodeType.EndElement && AppConfig.StringEquals(reader.Name, "dependentassembly"))
                {
                    break;
                }

                // Look for a <assemblyIdentity> element
                if (reader.NodeType == XmlNodeType.Element && AppConfig.StringEquals(reader.Name, "assemblyIdentity"))
                {
                    string name = null;
                    string publicKeyToken = "null";
                    string culture = "neutral";

                    // App.config seems to have mixed case attributes.
                    while (reader.MoveToNextAttribute())
                    {
                        if (AppConfig.StringEquals(reader.Name, "name"))
                        {
                            name = reader.Value;
                        }
                        else
                        if (AppConfig.StringEquals(reader.Name, "publicKeyToken"))
                        {
                            publicKeyToken = reader.Value;
                        }
                        else
                        if (AppConfig.StringEquals(reader.Name, "culture"))
                        {
                            culture = reader.Value;
                        }
                    }

                    string assemblyName = String.Format
                    (
                        CultureInfo.InvariantCulture,
                        "{0}, Version=0.0.0.0, Culture={1}, PublicKeyToken={2}",
                        name,
                        culture,
                        publicKeyToken
                    );

                    try
                    {
                        _partialAssemblyName = new AssemblyNameExtension(assemblyName).AssemblyName;
                    }
                    catch (System.IO.FileLoadException e)
                    {
                        // A badly formed assembly name.
                        ErrorUtilities.VerifyThrowArgument(false, e, "AppConfig.InvalidAssemblyIdentityFields");
                    }
                }

                // Look for a <bindingRedirect> element.
                if (reader.NodeType == XmlNodeType.Element && AppConfig.StringEquals(reader.Name, "bindingRedirect"))
                {
                    BindingRedirect bindingRedirect = new BindingRedirect();
                    bindingRedirect.Read(reader);
                    redirects.Add(bindingRedirect);
                }
            }
            _bindingRedirects = (BindingRedirect[])redirects.ToArray(typeof(BindingRedirect));
        }
Esempio n. 5
0
        /// <summary>
        /// The reader is positioned on a &lt;dependentassembly&gt; element--read it.
        /// </summary>
        /// <param name="reader"></param>
        internal void Read(XmlReader reader)
        {
            ArrayList redirects = new ArrayList();

            if (_bindingRedirects != null)
            {
                redirects.AddRange(_bindingRedirects);
            }

            while (reader.Read())
            {
                // Look for the end element.
                if (reader.NodeType == XmlNodeType.EndElement && AppConfig.StringEquals(reader.Name, "dependentassembly"))
                {
                    break;
                }

                // Look for a <assemblyIdentity> element
                if (reader.NodeType == XmlNodeType.Element && AppConfig.StringEquals(reader.Name, "assemblyIdentity"))
                {
                    string name           = null;
                    string publicKeyToken = "null";
                    string culture        = "neutral";

                    // App.config seems to have mixed case attributes.
                    while (reader.MoveToNextAttribute())
                    {
                        if (AppConfig.StringEquals(reader.Name, "name"))
                        {
                            name = reader.Value;
                        }
                        else
                        if (AppConfig.StringEquals(reader.Name, "publicKeyToken"))
                        {
                            publicKeyToken = reader.Value;
                        }
                        else
                        if (AppConfig.StringEquals(reader.Name, "culture"))
                        {
                            culture = reader.Value;
                        }
                    }

                    string assemblyName = String.Format
                                          (
                        CultureInfo.InvariantCulture,
                        "{0}, Version=0.0.0.0, Culture={1}, PublicKeyToken={2}",
                        name,
                        culture,
                        publicKeyToken
                                          );

                    try
                    {
                        _partialAssemblyName = new AssemblyNameExtension(assemblyName).AssemblyName;
                    }
                    catch (System.IO.FileLoadException e)
                    {
                        // A badly formed assembly name.
                        ErrorUtilities.VerifyThrowArgument(false, e, "AppConfig.InvalidAssemblyIdentityFields");
                    }
                }

                // Look for a <bindingRedirect> element.
                if (reader.NodeType == XmlNodeType.Element && AppConfig.StringEquals(reader.Name, "bindingRedirect"))
                {
                    BindingRedirect bindingRedirect = new BindingRedirect();
                    bindingRedirect.Read(reader);
                    redirects.Add(bindingRedirect);
                }
            }
            _bindingRedirects = (BindingRedirect[])redirects.ToArray(typeof(BindingRedirect));
        }
 internal void ResolveConflicts(out DependentAssembly[] idealRemappings, out AssemblyNameReference[] conflictingReferences)
 {
     idealRemappings = null;
     conflictingReferences = null;
     if (this.ResolveConflictsBetweenReferences() != 0)
     {
         Hashtable hashtable = new Hashtable(StringComparer.OrdinalIgnoreCase);
         Hashtable hashtable2 = new Hashtable(StringComparer.OrdinalIgnoreCase);
         foreach (AssemblyNameExtension extension in this.References.Keys)
         {
             Reference reference = this.GetReference(extension);
             if (reference.CheckForSpecificVersionMetadataOnParentsReference(true))
             {
                 AssemblyEntry entry = null;
                 if (this.installedAssemblies != null)
                 {
                     entry = this.installedAssemblies.FindHighestVersionInRedistList(extension);
                 }
                 if (entry != null)
                 {
                     continue;
                 }
             }
             byte[] publicKeyToken = extension.GetPublicKeyToken();
             if ((publicKeyToken != null) && (publicKeyToken.Length > 0))
             {
                 AssemblyName name = (AssemblyName) extension.AssemblyName.Clone();
                 Version version = name.Version;
                 name.Version = null;
                 string key = name.ToString();
                 if (hashtable.ContainsKey(key))
                 {
                     hashtable[key] = ((int) hashtable[key]) + 1;
                     Version version2 = ((AssemblyNameReference) hashtable2[key]).assemblyName.Version;
                     if ((version2 == null) || (version2 < version))
                     {
                         hashtable2[key] = AssemblyNameReference.Create(extension, reference);
                     }
                 }
                 else
                 {
                     hashtable[key] = 1;
                     hashtable2[key] = AssemblyNameReference.Create(extension, reference);
                 }
             }
         }
         List<AssemblyNameReference> list = new List<AssemblyNameReference>();
         foreach (string str2 in hashtable.Keys)
         {
             if (((int) hashtable[str2]) > 1)
             {
                 list.Add((AssemblyNameReference) hashtable2[str2]);
             }
         }
         List<DependentAssembly> list2 = new List<DependentAssembly>();
         foreach (AssemblyNameReference reference2 in list)
         {
             DependentAssembly item = new DependentAssembly {
                 PartialAssemblyName = reference2.assemblyName.AssemblyName
             };
             BindingRedirect redirect = new BindingRedirect {
                 OldVersionLow = new Version("0.0.0.0"),
                 OldVersionHigh = reference2.assemblyName.AssemblyName.Version,
                 NewVersion = reference2.assemblyName.AssemblyName.Version
             };
             item.BindingRedirects = new BindingRedirect[] { redirect };
             list2.Add(item);
         }
         idealRemappings = list2.ToArray();
         conflictingReferences = list.ToArray();
     }
 }