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)); }
/// <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(); }
/// <summary> /// The reader is positioned on a <dependentassembly> 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)); }
/// <summary> /// The reader is positioned on a <dependentassembly> 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(); } }