private static bool AssemblySatisfiesReference(AssemblyName assemblyName, AssemblyName reference) { if (reference.Name != assemblyName.Name) { return(false); } if ((reference.Version != null) && !reference.Version.Equals(assemblyName.Version)) { return(false); } if ((reference.CultureInfo != null) && !reference.CultureInfo.Equals(assemblyName.CultureInfo)) { return(false); } byte[] publicKeyToken = reference.GetPublicKeyToken(); if (publicKeyToken != null) { byte[] curKeyToken = assemblyName.GetPublicKeyToken(); if (!AssemblyNameEqualityComparer.IsSameKeyToken(publicKeyToken, curKeyToken)) { return(false); } } return(true); }
// this code is borrowed from XamlSchemaContext internal bool AssemblySatisfiesReference(AssemblyName assemblyName) { if (this.wrappedReference.AssemblyName.Name != assemblyName.Name) { return(false); } if (this.wrappedReference.AssemblyName.Version != null && !this.wrappedReference.AssemblyName.Version.Equals(assemblyName.Version)) { return(false); } if (this.wrappedReference.AssemblyName.CultureInfo != null && !this.wrappedReference.AssemblyName.CultureInfo.Equals(assemblyName.CultureInfo)) { return(false); } byte[] requiredToken = this.wrappedReference.AssemblyName.GetPublicKeyToken(); if (requiredToken != null) { byte[] actualToken = assemblyName.GetPublicKeyToken(); if (!AssemblyNameEqualityComparer.IsSameKeyToken(requiredToken, actualToken)) { return(false); } } return(true); }
internal IEnumerable <KeyValuePair <Type, IServiceLocationRegistrarProxyFactory> > GetRegistrarTypes() { var comparer = new AssemblyNameEqualityComparer(); var types = new List <Type>(); Assembly[] scansedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); List <AssemblyName> proxyAssemblies = (from p in this.proxies select p.Value.GetType().Assembly.GetName()).ToList(); List <Assembly> workingAssemblies = (from s in scansedAssemblies from r in proxyAssemblies where s.GetReferencedAssemblies().Contains(r, comparer) select s).ToList(); workingAssemblies.Add(this.GetType().Assembly); foreach (Assembly assembly in workingAssemblies) { try { types.AddRange(assembly.GetTypes()); } catch (ReflectionTypeLoadException loadEx) { List <Type> foundTypes = (from t in loadEx.Types where t.IsNotNull() select t).ToList(); types.AddRange(foundTypes); } } var preOrdered = new Queue <KeyValuePair <Type, IServiceLocationRegistrarProxyFactory> >(); foreach (Type type in types) { if (type.IsInterface) { continue; } foreach (var proxy in this.proxies) { if (proxy.Key.IsAssignableFrom(type) && !ReferenceEquals(type.GetConstructor(new Type[0]), null)) { preOrdered.Add(new KeyValuePair <Type, IServiceLocationRegistrarProxyFactory>(type, proxy.Value)); } } } var orderedList = new List <KeyValuePair <Type, IServiceLocationRegistrarProxyFactory> >(); while (preOrdered.Count > 0) { KeyValuePair <Type, IServiceLocationRegistrarProxyFactory> type = preOrdered.Remove(); bool addToList = true; foreach (var stackType in preOrdered) { if (type.Key.Assembly.GetReferencedAssemblies().Contains(stackType.Key.Assembly.GetName(), comparer)) { addToList = false; preOrdered.Add(type); break; } } if (addToList) { orderedList.Add(type); } } return(orderedList); }